home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Leser 15 / Amiga Plus Leser CD 15.iso / Tools / Freeware / reportplus / source / f1.c < prev    next >
Encoding:
C/C++ Source or Header  |  2002-03-13  |  75.4 KB  |  2,285 lines

  1. #include <exec/types.h>
  2. #include <exec/memory.h>
  3. #include <proto/exec.h>
  4. #include <intuition/intuition.h>
  5. #include <intuition/gadgetclass.h>
  6. #include <proto/intuition.h>
  7. #include <libraries/gadtools.h>
  8. #include <proto/gadtools.h>
  9. #include <dos/dos.h>
  10. #include <proto/dos.h>
  11. #include <graphics/gfx.h>
  12. #include <clib/graphics_protos.h>
  13.  
  14. #include <clib/alib_protos.h>
  15. #include <ctype.h>
  16. #include <stdlib.h>
  17. #include <string.h>
  18. #include "rp.h"
  19.  
  20. #define ALL_REACTION_CLASSES
  21. #include <reaction/reaction.h>
  22. #include <clib/texteditor_protos.h>
  23. #include <gadgets/texteditor.h>
  24. #include <pragmas/texteditor_pragmas.h>
  25.  
  26. #define SUBSYSTEMS   127
  27. #define CPUS           4
  28. #define MODELS        13
  29. #define MAXELEMENTS_1  4 // counting from 0
  30.  
  31. MODULE void refreshpv(void);
  32. MODULE void updatereportgadgets(void);
  33. MODULE void readreportgadgets(void);
  34. MODULE ULONG Hook1Func(struct Hook *h, VOID *o, VOID *msg);
  35. MODULE void updateemail(void);
  36.  
  37. AGLOBAL struct ReportStruct report;
  38.  
  39. MODULE struct Gadget*  report_gadgets[GIDS_1 + 1];
  40. MODULE ABOOL           SubsystemNodes          = FALSE;
  41. MODULE struct List     SubsystemList;
  42. MODULE struct Gadget  *CY11_Type               = NULL,
  43.                       *ST11_Summary            = NULL,
  44.                       *BU11_PathnameASL        = NULL,
  45.                       *LV11_Subsystem          = NULL,
  46.                       *CY11_Severity           = NULL,
  47.                       *ST11_Debug              = NULL,
  48.                       *ST11_KS                 = NULL,
  49.                       *ST11_WB                 = NULL,
  50.                       *ST11_Pathname           = NULL,
  51.                       *ST11_Version            = NULL,
  52.                       *TE11_3rdLabel           = NULL,
  53.                       *ST11_3rdName            = NULL,
  54.                       *ST11_3rdVer             = NULL,
  55.                       *ST11_3rdManuf           = NULL,
  56.                       *BU11_Sender             = NULL,
  57.                       *BU11_Config             = NULL,
  58.                       *TE11_EMailTo            = NULL,
  59.  
  60.                       *ST12_Company            = NULL,
  61.                       *ST12_Developer          = NULL,
  62.                       *ST12_EMail              = NULL,
  63.                       *ST12_FirstName          = NULL,
  64.                       *ST12_LastName           = NULL,
  65.                       *ST12_Phone              = NULL,
  66.  
  67.                       *MX13_Model              = NULL,
  68.                       *TE13_ModelText          = NULL,
  69.                       *MX13_Agnus              = NULL,
  70.                       *TE13_AgnusText          = NULL,
  71.                       *MX13_CPU                = NULL,
  72.                       *TE13_CPUText            = NULL,
  73.                       *IN13_Floppies           = NULL,
  74.                       *ST13_Chip               = NULL,
  75.                       *TE13_ChipText           = NULL,
  76.                       *ST13_Fast               = NULL,
  77.                       *TE13_FastText           = NULL,
  78.                       *ST13_Hard               = NULL,
  79.                       *ST13_Expansion          = NULL;
  80. MODULE struct
  81. {   STRPTR friendly;
  82.     STRPTR unfriendly;
  83. } subsystems[SUBSYSTEMS + 1] =
  84. {   {"3D Look",                "new.look"        },
  85.     {"A590",                   "A2091.A590"      },
  86.     {"A2013",                  "A2013"           },
  87.     {"A2065",                  "A2065"           },
  88.     {"A2090",                  "A2090.A2090A"    },
  89.     {"A2090A",                 "A2090.A2090A"    },
  90.     {"A2091",                  "A2091"           },
  91.     {"A2232",                  "A2232"           },
  92.     {"A2300",                  "A2300"           },
  93.     {"A2410",                  "A2410"           },
  94.     {"A2620",                  "A2620"           },
  95.     {"A2630",                  "A2630"           },
  96.     {"A3000",                  "A3000"           },
  97.     {"A4091",                  "A4091"           },
  98.     {"AmigaBASIC",             "AmigaBasic"      },
  99.     {"AGA chipset",            "aa.chips"        },
  100.     {"ALink",                  "alink"           },
  101.     {"amiga.lib",              "amiga.lib"       },
  102.     {"AmigaGuide",             "amigaguide"      },
  103.     {"AmigaTerm",              "amigaterm"       },
  104.     {"AmigaVision",            "amigavision"     },
  105.     {"AppShell",               "appshell"        },
  106.     {"ARexx",                  "arexx"           },
  107.     {"Art",                    "art"             },
  108.     {"AS225",                  "as225"           },
  109.     {"ASL.library",            "asl.library"     },
  110.     {"audio.device",           "audio.device"    },
  111.     {"AUTOCONFIG",             "autoconfig"      },
  112.     {"Battery-backed clock",   "battclock"       },
  113.     {"Battery-backed memory",  "battmem"         },
  114.     {"Bootstrap",              "strap"           },
  115.     {"BridgeBoard",            "bridgeboard"     },
  116.     {"BRU",                    "bru"             },
  117.     {"bullet.library",         "bullet"          },
  118.     {"C: programs",            "cdos.command"    },
  119.     {"CD.device",              "cd.device"       },
  120.     {"CD32 hardware",          "cdgs"            },
  121.     {"CDFileSystem",           "cdfilesystem"    },
  122.     {"CDTV",                   "cdtv"            },
  123.     {"CDTV.device",            "cdtv.device"     },
  124.     {"cdui",                   "cdui"            },
  125.     {"CIA.resource",           "cia.resource"    },
  126.     {"CLI",                    "shell"           },
  127.     {"clipboard.device",       "clipboard"       },
  128.     {"Commodities",            "commodities"     },
  129.     {"CON-Handler",            "con-handler"     },
  130.     {"console.device",         "console.device"  },
  131.     {"Custom chipset",         "custom.chips"    },
  132.     {"Datatypes",              "datatypes"       },
  133.     {"debug.lib",              "debug.lib"       },
  134.     {"Developer support",      "devsupport"      },
  135.     {"disk.resource",          "disk.resource"   },
  136.     {"diskfont.library",       "diskfont"        },
  137.     {"DOS.library",            "dos.library"     },
  138.     {"Early Startup Control",  "bootmenu"        },
  139.     {"Envoy",                  "envoy"           },
  140.     {"Exec.library",           "exec"            },
  141.     {"expansion.library",      "expansion"       },
  142.     {"filesystem",             "filesystem"      },
  143.     {"filesystem.resource",    "filesysres"      },
  144.     {"Fonts",                  "fonts"           },
  145.     {"Fountain",               "fountain"        },
  146.     {"gadget.classes",         "gadget.classes"  },
  147.     {"GadTools.library",       "gadtools"        },
  148.     {"gameport.device",        "gameport"        },
  149.     {"Genlock",                "genlock"         },
  150.     {"Graphics",               "graphics"        },
  151.     {"Hardware",               "hardware"        },
  152.     {"HDBackup",               "hdbackup"        },
  153.     {"HDToolBox",              "hdtoolbox"       },
  154.     {"icon.library",           "icon.library"    },
  155.     {"IconEdit",               "iconedit"        },
  156.     {"IDE.device",             "ide.device"      },
  157.     {"IFFParse.library",       "iffparse"        },
  158.     {"input.device",           "input.device"    },
  159.     {"Installer",              "installer"       },
  160.     {"IntelliFont",            "fountain"        },
  161.     {"Intuition.library",      "intuition"       },
  162.     {"IPrefs",                 "iprefs"          },
  163.     {"Keyboard",               "keyboard"        },
  164.     {"keymap.library",         "keymap"          },
  165.     {"Keymaps",                "keymaps"         },
  166.     {"layers.library",         "layers"          },
  167.     {"locale.library",         "locale.library"  },
  168.     {"lowlevel.library",       "lowlevel"        },
  169.     {"Maths: FFP",             "mathffp"         },
  170.     {"Maths: IEEE Double Precision", "mathieeedoub"    },
  171.     {"Maths: IEEE Single Precision", "mathieeesing"    },
  172.     {"Maths: IEEE",            "mathieee"        },
  173.     {"MicroEMACS",             "microemacs"      },
  174.     {"Monitors",               "monitors"        },
  175.     {"MultiView",              "multiview"       },
  176.     {"nonvolatile",            "nonvolatile"     },
  177.     {"parallel.device",        "parallel.device" },
  178.     {"PCMCIA",                 "creditcard"      },
  179.     {"PORT-Handler",           "port-handler"    },
  180.     {"potgo.resource",         "potgo.resource"  },
  181.     {"Preferences",            "preferences"     },
  182.     {"Printer drivers",        "printer.driver"  },
  183.     {"printer.device",         "printer.device"  },
  184.     {"QUEUE-Handler",          "queue-handler"   },
  185.     {"RAM-Handler",            "ram-handler"     },
  186.     {"ramlib",                 "ramlib"          },
  187.     {"realtime",               "realtime"        },
  188.     {"Report+",                "report+"         },
  189.     {"Resources",              "resource"        },
  190.     {"ROM Kernel Manuals",     "rkm"             },
  191.     {"ROMWack",                "wack"            },
  192.     {"SANA-2",                 "sana2"           },
  193.     {"Scripts",                "script"          },
  194.     {"SCSI.device",            "scsi.device"     },
  195.     {"serial.device",          "serial.device"   },
  196.     {"Shell",                  "shell"           },
  197.     {"Startup",                "startup"         },
  198.     {"System/ programs",       "system.command"  },
  199.     {"TCP/IP",                 "as225"           },
  200.     {"timer.device",           "timer.device"    },
  201.     {"ToolMaker",              "toolmaker"       },
  202.     {"Tools/ programs",        "tools"           },
  203.     {"trackdisk.device",       "trackdisk"       },
  204.     {"UNIX",                   "unix"            },
  205.     {"Unsure",                 ""                },
  206.     {"User manuals",           "userdocs"        },
  207.     {"Utilities/ programs",    "util.command"    },
  208.     {"utility.library",        "utility.library" },
  209.     {"Wack",                   "wack"            },
  210.     {"Workbench",              "workbench"       },
  211.     {"Worm Wars",              "wormwars"        }
  212. };
  213. MODULE STRPTR TypeOptions[4] =
  214. {   "System Software/Hardware Bug",
  215.     "3rd Party Product Compatibility",
  216.     "Enhancement Request",
  217.     NULL
  218. };
  219. MODULE STRPTR SeverityOptions[5] =
  220. {   (STRPTR) "Crashes, hangs or corrupts data",
  221.     (STRPTR) "Behaves incorrectly",
  222.     (STRPTR) "Cosmetic problem",
  223.     (STRPTR) "Works correctly",
  224.     NULL
  225. };
  226. MODULE STRPTR AgnusOptions[6] =
  227. {   (STRPTR) "AGA",
  228.     (STRPTR) "ECS PAL",
  229.     (STRPTR) "ECS NTSC",
  230.     (STRPTR) "OCS PAL",
  231.     (STRPTR) "OCS NTSC",
  232.     NULL
  233. };
  234. MODULE STRPTR CPUOptions[CPUS + 2] =
  235. {   (STRPTR) "68020",
  236.     (STRPTR) "68030",
  237.     (STRPTR) "68040",
  238.     (STRPTR) "68060",
  239.     (STRPTR) "PowerPC",
  240.     NULL
  241. };
  242. MODULE STRPTR ModelOptions[MODELS + 2] =
  243. {   (STRPTR) "A500",
  244.     (STRPTR) "A500+",
  245.     (STRPTR) "A600",
  246.     (STRPTR) "A1000",
  247.     (STRPTR) "A1200",
  248.     (STRPTR) "A1500",
  249.     (STRPTR) "A2000",
  250.     (STRPTR) "A2500",
  251.     (STRPTR) "A3000",
  252.     (STRPTR) "A4000",
  253.     (STRPTR) "CDTV",
  254.     (STRPTR) "CD32",
  255.     (STRPTR) "DraCo",
  256.     (STRPTR) "Emulator",
  257.     NULL
  258. };
  259.  
  260. IMPORT ULONG               offset;
  261. IMPORT TEXT                aslresult[MEDFIELD + 1];
  262. IMPORT TEXT                weekdaystring[10],
  263.                            datestring[10],
  264.                            timestring[9];
  265. IMPORT struct SharedStruct shared;
  266. IMPORT struct NewGadget    Gadget;
  267. IMPORT struct Gadget      *BU99_Right,
  268.                           *BU99_TextEditor,
  269.                           *GListPtr,
  270.                           *PrevGadPtr;
  271. IMPORT TEXT                IOBuffer[LONGESTFIELD + 1];
  272. IMPORT SBYTE               page;
  273. IMPORT ABOOL               certified, fillwindows;
  274. IMPORT TEXT                string[VLONGFIELD + 1];
  275. IMPORT struct Window*      MainWindowPtr;
  276. IMPORT struct Menu*        MenuPtr;
  277. IMPORT struct Screen*      ScreenPtr;
  278. IMPORT struct Library*     TextEditorBase;
  279. IMPORT Object*             WinObject[FUNCTIONS + 1];
  280.  
  281. /* report.textfield[] are:
  282.    0: brief bug description
  283.    1: bug generation procedure or example
  284.    2: if this works differently on other versions or hardware, explain
  285.    3: what developer is doing in that area of HW or SW
  286.    4: related problems
  287.    5: enhancement request */
  288.  
  289. AGLOBAL void report1(void)
  290. {  /* PAGE 11 ************************************************************ */
  291.  
  292.     verynewwindow
  293.     (   REPORTWIDTH, REPORTHEIGHT,
  294.         "Report+: Report Details (Page 1 of 2)",
  295.         BUTTONIDCMP | LISTVIEWIDCMP | STRINGIDCMP | CYCLEIDCMP
  296.     );
  297.     if (fillwindows)
  298.     {   SetAPen(MainWindowPtr->RPort, 0);
  299.         RectFill(MainWindowPtr->RPort,  10, 144,  10 + 238, 144 + 87 - 4); // LV11_Subsystem
  300.         RectFill(MainWindowPtr->RPort, 182,  32, 182 + 312,  32 + 12);     // TE11_EMailTo
  301.     }
  302.     OnMenu(MainWindowPtr, FULLMENUNUM(MN_PROJECT, IN_NEW,    NOSUB));
  303.     OnMenu(MainWindowPtr, FULLMENUNUM(MN_PROJECT, IN_OPEN,   NOSUB));
  304.     OnMenu(MainWindowPtr, FULLMENUNUM(MN_PROJECT, IN_SAVE,   NOSUB));
  305.     OnMenu(MainWindowPtr, FULLMENUNUM(MN_PROJECT, IN_SAVEAS, NOSUB));
  306.  
  307.     /* summary */
  308.     setgadget(182, 20, 448, 12, "_Summary:", PLACETEXT_LEFT);
  309.     ST11_Summary = PrevGadPtr = (struct Gadget *) CreateGadget
  310.     (   STRING_KIND,
  311.         PrevGadPtr,
  312.         &Gadget,
  313.         STRINGA_Justification, GACT_STRINGLEFT,
  314.         GTST_String, &(report.summary),
  315.         GTST_MaxChars, LONGFIELD,
  316.         GA_TabCycle, TRUE,
  317.         GT_Underscore, '_',
  318.         TAG_DONE
  319.     );
  320.     /* email to */
  321.     setgadget(182, 32, 312, 12, "EMail to:", PLACETEXT_LEFT);
  322.     TE11_EMailTo = PrevGadPtr = (struct Gadget *) CreateGadget
  323.     (   TEXT_KIND,
  324.         PrevGadPtr,
  325.         &Gadget,
  326.         GTTX_Border, TRUE,
  327.         TAG_DONE
  328.     );
  329.  
  330.     /* sender... */
  331.     setgadget(10,  86, 140, 12, "Sende_r...", NULL);
  332.     BU11_Sender = PrevGadPtr = (struct Gadget *) CreateGadget
  333.     (   BUTTON_KIND,
  334.         PrevGadPtr,
  335.         &Gadget,
  336.         GT_Underscore, '_',
  337.         TAG_DONE
  338.     );
  339.     /* configuration... */
  340.     setgadget(10,  98, 140, 12, "Confi_guration...", NULL);
  341.     BU11_Config = PrevGadPtr = (struct Gadget *) CreateGadget
  342.     (   BUTTON_KIND,
  343.         PrevGadPtr,
  344.         &Gadget,
  345.         GT_Underscore, '_',
  346.         TAG_DONE
  347.     );
  348.     /* text editor... */
  349.     setgadget(10, 110, 140, 12, "_Other page...", NULL);
  350.     BU99_TextEditor = PrevGadPtr = (struct Gadget *) CreateGadget
  351.     (   BUTTON_KIND,
  352.         PrevGadPtr,
  353.         &Gadget,
  354.         GT_Underscore, '_',
  355.         TAG_DONE
  356.     );
  357.  
  358.     /* type */
  359.     setgadget(100, 54, 284, 12, "_Type:", PLACETEXT_LEFT);
  360.     CY11_Type = PrevGadPtr = (struct Gadget *) CreateGadget
  361.     (   CYCLE_KIND,
  362.         PrevGadPtr,
  363.         &Gadget,
  364.         GTCY_Labels, TypeOptions,
  365.         GTCY_Active, report.type,
  366.         GT_Underscore, '_',
  367.         TAG_DONE
  368.     );
  369.  
  370.     /* classification */
  371.     setgadget(100, 66, 284, 12, "Sever_ity:", PLACETEXT_LEFT);
  372.     CY11_Severity = PrevGadPtr = (struct Gadget *) CreateGadget
  373.     (   CYCLE_KIND,
  374.         PrevGadPtr,
  375.         &Gadget,
  376.         GTCY_Labels, SeverityOptions,
  377.         GTCY_Active, report.severity,
  378.         GT_Underscore, '_',
  379.         TAG_DONE
  380.     );
  381.  
  382.     setgadget(10, 144, 238, 87, "Subsystem:", NULL);
  383.     LV11_Subsystem = PrevGadPtr = (struct Gadget *) CreateGadget
  384.     (   LISTVIEW_KIND,
  385.         PrevGadPtr,
  386.         &Gadget,
  387.         GTLV_Labels, &SubsystemList,
  388.         GTLV_ShowSelected, NULL,
  389.         GTLV_Selected, report.subsystem,
  390.         GT_Underscore, '_',
  391.         TAG_DONE
  392.     );
  393.  
  394.     /* 3rd party product */
  395.     setgadget(422, 190, 100, 1, "3rd Party Product:", PLACETEXT_ABOVE);
  396.     TE11_3rdLabel = PrevGadPtr = (struct Gadget *) CreateGadget
  397.     (   TEXT_KIND,
  398.         PrevGadPtr,
  399.         &Gadget,
  400.         TAG_DONE
  401.     );
  402.     /* 3rd party product name */
  403.     setgadget(400, 190, 200, 12, "N_ame:", NULL);
  404.     ST11_3rdName = PrevGadPtr = (struct Gadget *) CreateGadget
  405.     (   STRING_KIND,
  406.         PrevGadPtr,
  407.         &Gadget,
  408.         GTST_String, &(report.thirdname),
  409.         GTST_MaxChars, MEDFIELD,
  410.         GA_TabCycle, TRUE,
  411.         GT_Underscore, '_',
  412.         TAG_DONE
  413.     );
  414.     /* 3rd party product version */
  415.     setgadget(400, 202, 100, 12, "_Version:", NULL);
  416.     ST11_3rdVer = PrevGadPtr = (struct Gadget *) CreateGadget
  417.     (   STRING_KIND,
  418.         PrevGadPtr,
  419.         &Gadget,
  420.         GTST_String, &(report.thirdver),
  421.         GTST_MaxChars, MEDFIELD,
  422.         GA_TabCycle, TRUE,
  423.         GT_Underscore, '_',
  424.         TAG_DONE
  425.     );
  426.     /* 3rd party product manufacturer */
  427.     setgadget(400, 214, 200, 12, "_Manufacturer:", NULL);
  428.     ST11_3rdManuf = PrevGadPtr = (struct Gadget *) CreateGadget
  429.     (   STRING_KIND,
  430.         PrevGadPtr,
  431.         &Gadget,
  432.         GTST_String, &(report.thirdmanuf),
  433.         GTST_MaxChars, MEDFIELD,
  434.         GA_TabCycle, TRUE,
  435.         GT_Underscore, '_',
  436.         TAG_DONE
  437.     );
  438.  
  439.     /* debug tools and wedges */
  440.     setgadget(400, 78, 196, 12, "_Debug tools and wedges:", PLACETEXT_ABOVE);
  441.     ST11_Debug = PrevGadPtr = (struct Gadget *) CreateGadget
  442.     (   STRING_KIND,
  443.         PrevGadPtr,
  444.         &Gadget,
  445.         STRINGA_Justification, GACT_STRINGLEFT,
  446.         GTST_String, &(report.debug),
  447.         GTST_MaxChars, LONGFIELD,
  448.         GA_TabCycle, TRUE,
  449.         GT_Underscore, '_',
  450.         TAG_DONE
  451.     );
  452.  
  453.     /* kickstart version */
  454.     if (report.ks[0] == 0)
  455.         if (GetVar("Kickstart", report.ks, 6, NULL) == -1)
  456.             report.ks[0] = 0;
  457.     setgadget(400, 102, 60, 12, "_Kickstart version:", NULL);
  458.     ST11_KS = PrevGadPtr = (struct Gadget *) CreateGadget
  459.     (   STRING_KIND,
  460.         PrevGadPtr,
  461.         &Gadget,
  462.         GTST_String, &(report.ks),
  463.         GTST_MaxChars, 6,
  464.         GA_TabCycle, TRUE,
  465.         GT_Underscore, '_',
  466.         STRINGA_Justification, GACT_STRINGRIGHT,
  467.         TAG_DONE
  468.     );
  469.     /* workbench version */
  470.     if (report.wb[0] == 0)
  471.         if (GetVar("Workbench", report.wb, 6, NULL) == -1)
  472.             report.wb[0] = 0;
  473.     setgadget(400, 114, 60, 12, "_Workbench version:", NULL);
  474.     ST11_WB = PrevGadPtr = (struct Gadget *) CreateGadget
  475.     (   STRING_KIND,
  476.         PrevGadPtr,
  477.         &Gadget,
  478.         GTST_String, &(report.wb),
  479.         GTST_MaxChars, 6,
  480.         GA_TabCycle, TRUE,
  481.         GT_Underscore, '_',
  482.         STRINGA_Justification, GACT_STRINGRIGHT,
  483.         TAG_DONE
  484.     );
  485.  
  486.     /* program pathname */
  487.     setgadget(400, 138, 196, 12, "P_rogram pathname:", NULL);
  488.     ST11_Pathname = PrevGadPtr = (struct Gadget *) CreateGadget
  489.     (   STRING_KIND,
  490.         PrevGadPtr,
  491.         &Gadget,
  492.         GTST_String, &(report.pp),
  493.         GTST_MaxChars, LONGFIELD,
  494.         GA_TabCycle, TRUE,
  495.         GT_Underscore, '_',
  496.         TAG_DONE
  497.     );
  498.     /* program... */
  499.     setgadget(598, 138, 28, 12, "...", NULL);
  500.     BU11_PathnameASL = PrevGadPtr = (struct Gadget *) CreateGadget
  501.     (   BUTTON_KIND,
  502.         PrevGadPtr,
  503.         &Gadget,
  504.         GT_Underscore, '_',
  505.         TAG_DONE
  506.     );
  507.     /* program version */
  508.     setgadget(400, 150, 196, 12, "Program v_ersion:", NULL);
  509.     ST11_Version = PrevGadPtr = (struct Gadget *) CreateGadget
  510.     (   STRING_KIND,
  511.         PrevGadPtr,
  512.         &Gadget,
  513.         GTST_String, &(report.pv),
  514.         GTST_MaxChars, LONGFIELD,
  515.         GA_TabCycle, TRUE,
  516.         GT_Underscore, '_',
  517.         TAG_DONE
  518.     );
  519.  
  520.     drawgadgets((UWORD) ~0);
  521.  
  522.     updatereportgadgets(); // we do need this here, so that gadgets are
  523.                            // ghosted as appropriate
  524.     ActivateGadget(ST11_Summary, MainWindowPtr, NULL);
  525.  
  526.     loop();
  527.     readreportgadgets();
  528.     closewindow();
  529. }
  530.  
  531. MODULE void readreportgadgets(void)
  532. {   strcpy
  533.     (   report.summary,
  534.         ((struct StringInfo *) ST11_Summary->SpecialInfo)->Buffer
  535.     );
  536.     if (report.type == COM)
  537.     {   strcpy
  538.         (   report.thirdver,
  539.             ((struct StringInfo *) ST11_3rdVer->SpecialInfo)->Buffer
  540.         );
  541.         strcpy
  542.         (   report.thirdname,
  543.             ((struct StringInfo *) ST11_3rdName->SpecialInfo)->Buffer
  544.         );
  545.         strcpy
  546.         (   report.thirdmanuf,
  547.             ((struct StringInfo *) ST11_3rdManuf->SpecialInfo)->Buffer
  548.         );
  549.     } elif (report.type == BUG)
  550.     {   strcpy
  551.         (   report.pp,
  552.             ((struct StringInfo *) ST11_Pathname->SpecialInfo)->Buffer
  553.         );
  554.         strcpy
  555.         (   report.pv,
  556.             ((struct StringInfo *) ST11_Version->SpecialInfo)->Buffer
  557.         );
  558.     }
  559.     if (report.type != ENH)
  560.     {   strcpy
  561.         (   report.ks,
  562.             ((struct StringInfo *) ST11_KS->SpecialInfo)->Buffer
  563.         );
  564.         strcpy
  565.         (   report.wb,
  566.             ((struct StringInfo *) ST11_WB->SpecialInfo)->Buffer
  567.         );
  568.         strcpy
  569.         (   report.debug,
  570.             ((struct StringInfo *) ST11_Debug->SpecialInfo)->Buffer
  571.         );
  572. }   }
  573.  
  574. AGLOBAL void savereport(ABOOL saveas)
  575. { /*    # Subject: <subject><LF>
  576.         # Type: bug|compat|enhancement<LF>
  577. 1,3     # Subsystem: <subsystem><LF>
  578. 2       # ProductName: <name> (vers=<version>)
  579. 2       # ProductInfo: :<manufacturer>:
  580.         # Severity: a|b|c|ok|e
  581. 1       # Release: KS=<version>,WB=<version>,Program=<version>
  582. 2       # Release: KS=<version>,WB=<version>
  583.         # Date: <weekday> dd-Mon-yy hh:mm:ss
  584.         # Refer: <refer>
  585.         # Path: <path>
  586.         # ReferID: <referid>
  587.         # Config: <config>
  588. 1,2a-c    ### BRIEF BUG DESCRIPTION:
  589. 1,2a-c    ### BUG GENERATION PROCEDURE OR EXAMPLE:
  590. 1,2     ### ALSO RUNNING:
  591.         <debug>
  592. 1,2     ### IF THIS WORKS DIFFERENTLY ON OTHER VERSIONS OR HARDWARE,
  593.         EXPLAIN:
  594. 2a-c    ### WHAT DEVELOPER IS DOING IN THAT AREA OF SW OR HW:    
  595. 1,2a-c    ### RELATED PROBLEMS:
  596. 3       ### ENHANCEMENT REQUEST: */
  597.  
  598.     readreportgadgets();
  599.  
  600.     strcpy(IOBuffer, "# Subject: ");
  601.     strcat(IOBuffer, report.summary);
  602.     strcat(IOBuffer, "\n# Type: ");
  603.     if (report.type == BUG)
  604.     strcat(IOBuffer, "bug");
  605.     elif (report.type == COM)
  606.         strcat(IOBuffer, "compat");
  607.     else /* assumes (report.type == ENH) */
  608.         strcat(IOBuffer, "enhancement");
  609.     strcat(IOBuffer, "\n");
  610.     if (report.type == BUG || report.type == ENH)
  611.     {    strcat(IOBuffer, "# Subsystem: ");
  612.         strcat(IOBuffer, subsystems[report.subsystem].unfriendly);
  613.     strcat(IOBuffer, "\n");
  614.     } else
  615.     {    strcat(IOBuffer, "# ProductName: ");
  616.     strcat(IOBuffer, report.thirdname);
  617.         strcat(IOBuffer, " (vers=");
  618.         strcat(IOBuffer, report.thirdver);
  619.         strcat(IOBuffer, ")\n# ProductInfo: :");
  620.         strcat(IOBuffer, report.thirdmanuf);
  621.         strcat(IOBuffer, ":\n");
  622.     }
  623.     strcat(IOBuffer, "# Severity: ");
  624.     if (report.type == ENH)
  625.         strcat(IOBuffer, "e");
  626.     elif (report.severity == 0)
  627.         strcat(IOBuffer, "a");
  628.     elif (report.severity == 1)
  629.         strcat(IOBuffer, "b");
  630.     elif (report.severity == 2)
  631.         strcat(IOBuffer, "c");
  632.     else /* assumes report.severity == 3 */
  633.     strcat(IOBuffer, "ok");
  634.     strcat(IOBuffer, "\n");
  635.     if (report.type == BUG || report.type == COM)
  636.     {    strcat(IOBuffer, "# Release: KS=");
  637.         strcat(IOBuffer, report.ks);
  638.         strcat(IOBuffer, ",WB=");
  639.         strcat(IOBuffer, report.wb);
  640.         if (report.type == BUG)
  641.         {    strcat(IOBuffer, ",Program=");
  642.             strcat(IOBuffer, report.pv);
  643.         }
  644.         strcat(IOBuffer, "\n");
  645.     }
  646.     
  647.     getdate();
  648.     strcat(IOBuffer, "# Date: ");
  649.     strcat(IOBuffer, weekdaystring);
  650.     strcat(IOBuffer, " ");
  651.     strcat(IOBuffer, datestring);
  652.     strcat(IOBuffer, " ");
  653.     strcat(IOBuffer, timestring);
  654.     strcat(IOBuffer, "\n");
  655.     strcat(IOBuffer, report.refer);
  656.     strcat(IOBuffer, report.path);
  657.     strcat(IOBuffer, report.referid);
  658.     strcat(IOBuffer, report.config);
  659.     strcat(IOBuffer, "\n");
  660.  
  661.     if (report.type == BUG || (report.type == COM && report.severity != 3))
  662.     {   strcat
  663.         (   IOBuffer,
  664.             "### BRIEF BUG DESCRIPTION:\n"
  665.         );
  666.         strcat(IOBuffer, report.textfield[0]);
  667.         strcat
  668.         (   IOBuffer,
  669.             "\n\n### BUG GENERATION PROCEDURE OR EXAMPLE:\n"
  670.     );
  671.         strcat(IOBuffer, report.textfield[1]);
  672.         strcat(IOBuffer, "\n\n");
  673.     }
  674.     if (report.type == BUG || report.type == COM)
  675.     {   strcat(IOBuffer, "### ALSO RUNNING:\n");
  676.         strcat(IOBuffer, report.debug);
  677.         strcat
  678.         (   IOBuffer,
  679.             "\n\n### IF THIS WORKS DIFFERENTLY ON "
  680.             "OTHER VERSIONS OR HARDWARE, EXPLAIN:\n"
  681.         );
  682.         strcat(IOBuffer, report.textfield[2]);
  683.         strcat(IOBuffer, "\n\n");
  684.     }
  685.     if (report.type == COM && report.severity != 3)
  686.     {   strcat
  687.         (   IOBuffer,
  688.             "### WHAT DEVELOPER IS DOING IN THAT AREA OF HW OR SW:\n"
  689.         );
  690.         strcat(IOBuffer, report.textfield[3]);
  691.         strcat(IOBuffer, "\n\n");
  692.     }
  693.     if (report.type == BUG || (report.type == COM && report.severity != 3))
  694.     {   strcat(IOBuffer, "### RELATED PROBLEMS:\n");
  695.         strcat(IOBuffer, report.textfield[4]);
  696.         strcat(IOBuffer, "\n\n");
  697.     } elif (report.type == ENH)
  698.     {   strcat(IOBuffer, "### ENHANCEMENT REQUEST:\n");
  699.         strcat(IOBuffer, report.textfield[5]);
  700.         strcat(IOBuffer, "\n\n");
  701.     }
  702.  
  703.     if (!report.output[0] || saveas) // if we need a filename
  704.     {   if (saveasl("Save Bug Report", "~(#?.info)"))
  705.         {   strcpy(report.output, aslresult);
  706.             writeout(report.output);
  707.     }   }
  708.     else
  709.     {   writeout(report.output);
  710. }   }
  711.     
  712. AGLOBAL void report_ra_loop(ULONG gid)
  713. {   switch(gid)
  714.     {
  715.     case GID_1_BU1:
  716.         page = 11;
  717.     break;
  718.     case GID_1_BU2:
  719.         page = 0;
  720.     break;
  721.     default:
  722.     break;
  723. }   }
  724.  
  725. AGLOBAL void report_gt_loop(ULONG class, struct Gadget* addr, UWORD code, UWORD qual)
  726. {   if (page == 11)
  727.     {   if (class == IDCMP_RAWKEY && report.type != COM)
  728.         {   if (qual & IEQUALIFIER_CONTROL)
  729.             {   if (code == SCAN_UP)
  730.                 {   GT_SetGadgetAttrs
  731.                     (   LV11_Subsystem,
  732.                         MainWindowPtr,
  733.                         NULL,
  734.                         GTLV_Top, 0,
  735.                         TAG_DONE
  736.                     );
  737.                 } elif (code == SCAN_DOWN)
  738.                 {   GT_SetGadgetAttrs
  739.                     (   LV11_Subsystem,
  740.                         MainWindowPtr,
  741.                         NULL,
  742.                         GTLV_Top, SUBSYSTEMS - 10 + 1,
  743.                         // this must change according to height of listview
  744.                         TAG_DONE
  745.                     );
  746.         }   }   }
  747.         elif (class == IDCMP_VANILLAKEY)
  748.         {   code = toupper(code);
  749.             if (code == ESCAPE)
  750.             {   page = 0;
  751.             } elif (code == 'N')
  752.             {   page = 12;
  753.             } elif (code == 'T')
  754.             {   if ((qual & IEQUALIFIER_LSHIFT) || (qual & IEQUALIFIER_RSHIFT))
  755.                 {   if (report.type == 0)
  756.                     {   report.type = 2;
  757.                     } else report.type--;
  758.                 } else
  759.                 {   if (report.type == 2)
  760.                     {   report.type = 0;
  761.                     } else report.type++;
  762.                 }
  763.                 updatereportgadgets();
  764.             } elif (code == 'S')
  765.             {   ActivateGadget(ST11_Summary, MainWindowPtr, NULL);
  766.             } elif (code == 'O')
  767.             {   page = 14;
  768.             } elif (code == 'R')
  769.             {   page = 12;
  770.             } elif (code == 'G')
  771.             {   page = 13;
  772.             } elif (report.type != ENH)
  773.             {   if (code == 'K')
  774.                 {   ActivateGadget(ST11_KS, MainWindowPtr, NULL);
  775.                 } elif (code == 'W')
  776.                 {   ActivateGadget(ST11_WB, MainWindowPtr, NULL);
  777.                 } elif (code == 'D')
  778.                 {   ActivateGadget(ST11_Debug, MainWindowPtr, NULL);
  779.                 } elif (code == 'I')
  780.                 {   if ((qual & IEQUALIFIER_LSHIFT) || (qual & IEQUALIFIER_RSHIFT))
  781.                     {   if (report.severity == 0)
  782.                         {   report.severity = 3;
  783.                         } else report.severity--;
  784.                     } else
  785.                     {   if (report.severity == 3)
  786.                         {   report.severity = 0;
  787.                         } else report.severity++;
  788.                     }
  789.                     if (report.type == BUG && report.severity == 3)
  790.                     {   report.severity = 0;
  791.                     }
  792.                     GT_SetGadgetAttrs
  793.                     (   CY11_Severity,
  794.                         MainWindowPtr,
  795.                         NULL,
  796.                         GTCY_Active, report.severity,
  797.                         TAG_DONE
  798.                     );
  799.                 } elif (report.type == BUG)
  800.                 {   if (code == 'P')
  801.                     {   ActivateGadget(ST11_Pathname, MainWindowPtr, NULL);
  802.                     } elif (code == 'E')
  803.                     {   ActivateGadget(ST11_Version, MainWindowPtr, NULL);
  804.                 }   }
  805.                 else
  806.                 {   // assert(report.type == COM);
  807.                     if (code == 'A')
  808.                     {   ActivateGadget(ST11_3rdName, MainWindowPtr, NULL);
  809.                     } elif (code == 'V')
  810.                     {   ActivateGadget(ST11_3rdVer, MainWindowPtr, NULL);
  811.                     } elif (code == 'M')
  812.                     {   ActivateGadget(ST11_3rdManuf, MainWindowPtr, NULL);
  813.         }   }   }   }
  814.         elif (class == IDCMP_GADGETUP)
  815.         {   if (addr == BU99_Right)
  816.             {   page = 0;
  817.             } elif (addr == BU11_Sender)
  818.             {   page = 12;
  819.             } elif (addr == BU11_Config)
  820.             {   page = 13;
  821.             } elif (addr == BU99_TextEditor)
  822.             {   page = 14;
  823.             } elif (addr == CY11_Type)
  824.             {   report.type = code;
  825.                 updatereportgadgets();
  826.             } elif (report.type != COM && addr == LV11_Subsystem)
  827.             {   // code is the position within the list.
  828.                 report.subsystem = code;
  829.                 updateemail();
  830.             } elif (report.type != ENH)
  831.             {   if (addr == CY11_Severity)
  832.                 {   report.severity = code;
  833.                     if (report.type == BUG && report.severity == 3)
  834.                     {   report.severity = 0;
  835.                         GT_SetGadgetAttrs
  836.                         (   CY11_Severity,
  837.                             MainWindowPtr,
  838.                             NULL,
  839.                             GTCY_Active, report.severity,
  840.                             TAG_DONE
  841.                         );
  842.                 }   }
  843.                 elif (report.type == BUG)
  844.                 {   if (addr == ST11_Pathname)
  845.                     {   refreshpv();
  846.                     } elif (addr == BU11_PathnameASL)
  847.                     {   if (asl("~(#?.info)"))
  848.                         {   GT_SetGadgetAttrs
  849.                             (   ST11_Pathname,
  850.                                 MainWindowPtr,
  851.                                 NULL,
  852.                                 GTST_String, aslresult,
  853.                                 TAG_DONE
  854.                             );
  855.                             refreshpv();
  856.     }   }   }   }   }   }
  857.     elif (page == 12)
  858.     {   if (class == IDCMP_GADGETUP)
  859.         {   if (addr == BU99_Right)
  860.             {   if (certified)
  861.                     page = 33;
  862.                 else page = 11;
  863.         }   }
  864.         elif (class == IDCMP_VANILLAKEY)
  865.         {   code = toupper(code);
  866.             if (code == ESCAPE)
  867.             {   if (certified)
  868.                     page = 33;
  869.                 else page = 11;
  870.             } elif (code == 'F')
  871.             {   ActivateGadget(ST12_FirstName, MainWindowPtr, NULL);
  872.             } elif (code == 'L')
  873.             {   ActivateGadget(ST12_LastName,  MainWindowPtr, NULL);
  874.             } elif (code == 'C')
  875.             {   ActivateGadget(ST12_Company,   MainWindowPtr, NULL);
  876.             } elif (code == 'D')
  877.             {   ActivateGadget(ST12_Developer, MainWindowPtr, NULL);
  878.             } elif (code == 'P')
  879.             {   ActivateGadget(ST12_Phone,     MainWindowPtr, NULL);
  880.             } elif (code == 'E')
  881.             {   ActivateGadget(ST12_EMail,     MainWindowPtr, NULL);
  882.     }   }   }
  883.     elif (page == 13)
  884.     {   if (class == IDCMP_VANILLAKEY)
  885.         {   code = toupper(code);
  886.             if (code == ESCAPE)
  887.             {   page = 11;
  888.             } elif (code == 'I')
  889.             {   if ((code & IEQUALIFIER_LSHIFT) || (code & IEQUALIFIER_RSHIFT))
  890.                 {   if (report.agnus == 0)
  891.                         report.agnus = 5;
  892.                     else report.agnus--;
  893.                 } else
  894.                 {   if (report.agnus == 5)
  895.                         report.agnus = 0;
  896.                     else report.agnus++;
  897.                 }
  898.                 GT_SetGadgetAttrs
  899.                 (   MX13_Agnus,
  900.                     MainWindowPtr,
  901.                     NULL,
  902.                     GTMX_Active, report.agnus,
  903.                     TAG_DONE
  904.                 );
  905.             } elif (code == 'C')
  906.             {   ActivateGadget(ST13_Chip, MainWindowPtr, NULL);
  907.             } elif (code == 'E')
  908.             {   ActivateGadget(ST13_Expansion, MainWindowPtr, NULL);
  909.             } elif (code == 'H')
  910.             {   ActivateGadget(ST13_Hard, MainWindowPtr, NULL);
  911.             } elif (code == 'M')
  912.             {   if ((code & IEQUALIFIER_LSHIFT) || (code & IEQUALIFIER_RSHIFT))
  913.                 {   if (report.model == 0)
  914.                         report.model = MODELS;
  915.                     else report.model--;
  916.                 } else
  917.                 {   if (report.model == CPUS)
  918.                         report.model = 0;
  919.                     else report.model++;
  920.                 }
  921.                 GT_SetGadgetAttrs
  922.                 (   MX13_Model,
  923.                     MainWindowPtr,
  924.                     NULL,
  925.                     GTMX_Active, report.model,
  926.                     TAG_DONE
  927.                 );
  928.             } elif (code == 'N')
  929.             {   ActivateGadget(IN13_Floppies, MainWindowPtr, NULL);
  930.             } elif (code == 'P')
  931.             {   if ((code & IEQUALIFIER_LSHIFT) || (code & IEQUALIFIER_RSHIFT))
  932.                 {   if (report.cpu == 0)
  933.                         report.cpu = CPUS;
  934.                     else report.cpu--;
  935.                 } else
  936.                 {   if (report.cpu == CPUS)
  937.                         report.cpu = 0;
  938.                     else report.cpu++;
  939.                 }
  940.                 GT_SetGadgetAttrs
  941.                 (   MX13_CPU,
  942.                     MainWindowPtr,
  943.                     NULL,
  944.                     GTMX_Active, report.cpu,
  945.                     TAG_DONE
  946.                 );
  947.             } elif (code == 'S')
  948.             {   ActivateGadget(ST13_Fast, MainWindowPtr, NULL);
  949.         }   }
  950.         elif (class == IDCMP_GADGETUP)
  951.         {   if (addr == BU99_Right)
  952.                 page = 11;
  953.             elif (addr == IN13_Floppies)
  954.             {   report.floppies = ((struct StringInfo *) IN13_Floppies->SpecialInfo)->LongInt;
  955.                 if (report.floppies < 0)
  956.                 {   report.floppies = 0;
  957.                     GT_SetGadgetAttrs
  958.                     (   IN13_Floppies,
  959.                         MainWindowPtr,
  960.                         NULL,
  961.                         GTIN_Number, report.floppies,
  962.                         TAG_DONE
  963.                     );
  964.                 } elif (report.floppies > 3)
  965.                 {   report.floppies = 3;
  966.                     GT_SetGadgetAttrs
  967.                     (   IN13_Floppies,
  968.                         MainWindowPtr,
  969.                         NULL,
  970.                         GTIN_Number, report.floppies,
  971.                         TAG_DONE
  972.                     );
  973.         }   }   }
  974.         elif (class == IDCMP_GADGETDOWN)
  975.         {   if (addr == MX13_Model)
  976.                 report.model = code;
  977.             elif (addr == MX13_CPU)
  978.                 report.cpu = code;
  979.             elif (addr == MX13_Agnus)
  980.             {   report.agnus = code;
  981. }   }   }   }
  982.  
  983. MODULE void refreshpv(void)
  984. {       ULONG   i;
  985.     BPTR    FileHandle;
  986.  
  987.         strcpy(string, "Version ");
  988.     strcat
  989.     (   string,
  990.             ((struct StringInfo *) ST11_Pathname->SpecialInfo)->Buffer
  991.     );
  992.         if (!(FileHandle = (BPTR) Open("T:ReportPlus.temp", MODE_NEWFILE)))
  993.         rq("Can't open T:ReportPlus.temp for writing!");
  994.     if (!Execute(string, NULL, FileHandle))
  995.             rq("Can't execute Version!");
  996.     if (!Close(FileHandle))
  997.         rq("Can't close T:ReportPlus.temp for writing!");
  998.  
  999.         readordie("T:ReportPlus.temp");
  1000.  
  1001.     DeleteFile("T:ReportPlus.temp"); /* returns FALSE for failure */
  1002.     for (i = 0; i <= MEDFIELD; i++)
  1003.             if (IOBuffer[i] == LF)
  1004.             {   IOBuffer[i] = 0;
  1005.                 break;
  1006.             }
  1007.     GT_SetGadgetAttrs
  1008.         (   ST11_Version,
  1009.         MainWindowPtr,
  1010.         NULL,
  1011.         GTST_String, IOBuffer,
  1012.         TAG_DONE
  1013.     );
  1014. }
  1015.  
  1016. AGLOBAL void report_die(void)
  1017. {   if (SubsystemNodes)
  1018.     {   FreeNameNodes(&SubsystemList);
  1019.         SubsystemNodes = FALSE;
  1020. }   }
  1021.  
  1022. AGLOBAL void report_init(void)
  1023. {   ULONG i;
  1024.  
  1025.     NewList(&SubsystemList);
  1026.     for (i = 0; i <= SUBSYSTEMS; i++)
  1027.         AddNameToTail(&SubsystemList, subsystems[i].friendly);
  1028.     SubsystemNodes = TRUE;
  1029.  
  1030.     newreport(FALSE);
  1031. }
  1032.  
  1033. AGLOBAL void sender(void)
  1034. {   /* PAGE 12 *************************************************************/
  1035.  
  1036.     verynewwindow
  1037.     (   SENDERWIDTH, SENDERHEIGHT,
  1038.         "Report+: Sender Details",
  1039.         BUTTONIDCMP | STRINGIDCMP
  1040.     );
  1041.  
  1042.     if ((!report.loaded) && readin("S:Report.sender"))
  1043.     {   /* # Refer: <last>,<first> (<company> ,phone <phone>)<LF>
  1044.            # Path: <email><LF>
  1045.            # ReferID: <developer><LF> */
  1046.  
  1047.         offset = 0;
  1048.         parse("# Refer: ");
  1049.         parse(",");
  1050.         strcpy(report.lastname,  string);
  1051.         parse(" (");
  1052.         strcpy(report.firstname, string);
  1053.         parse(" ,phone ");
  1054.         strcpy(report.company,   string);
  1055.         parse(")\n# Path: ");
  1056.         strcpy(report.phone,     string);
  1057.         parse("\n# ReferID: ");
  1058.         strcpy(report.email,     string);
  1059.         parse("\n");
  1060.         strcpy(report.developer, string);
  1061.     }
  1062.  
  1063.     /* first name */
  1064.     setgadget(166, 22, 256, 12, "_First name:", NULL);
  1065.     ST12_FirstName = PrevGadPtr = (struct Gadget *) CreateGadget
  1066.     (   STRING_KIND,
  1067.     PrevGadPtr,
  1068.     &Gadget,
  1069.     GTST_String, &(report.firstname),
  1070.     GTST_MaxChars, MEDFIELD,
  1071.     GA_TabCycle, TRUE,
  1072.         GT_Underscore, '_',
  1073.     TAG_DONE
  1074.     );
  1075.  
  1076.     /* last name */
  1077.     setgadget(166, 34, 256, 12, "_Last name:", NULL);
  1078.     ST12_LastName = PrevGadPtr = (struct Gadget *) CreateGadget
  1079.     (   STRING_KIND,
  1080.     PrevGadPtr,
  1081.     &Gadget,
  1082.     GTST_String, &(report.lastname),
  1083.     GTST_MaxChars, MEDFIELD,
  1084.     GA_TabCycle, TRUE,
  1085.         GT_Underscore, '_',
  1086.     TAG_DONE
  1087.     );
  1088.  
  1089.     /* company name */
  1090.     setgadget(166, 46, 256, 12, "_Company:", NULL);
  1091.     ST12_Company = PrevGadPtr = (struct Gadget *) CreateGadget
  1092.     (   STRING_KIND,
  1093.     PrevGadPtr,
  1094.     &Gadget,
  1095.     GTST_String, &(report.company),
  1096.     GTST_MaxChars, MEDFIELD,
  1097.     GA_TabCycle, TRUE,
  1098.         GT_Underscore, '_',
  1099.     TAG_DONE
  1100.     );
  1101.  
  1102.     /* phone */
  1103.     setgadget(166, 58, 256, 12, "_Phone number:", NULL);
  1104.     ST12_Phone = PrevGadPtr = (struct Gadget *) CreateGadget
  1105.     (   STRING_KIND,
  1106.     PrevGadPtr,
  1107.     &Gadget,
  1108.     GTST_String, &(report.phone),
  1109.     GTST_MaxChars, MEDFIELD,
  1110.     GA_TabCycle, TRUE,
  1111.         GT_Underscore, '_',
  1112.     TAG_DONE
  1113.     );
  1114.  
  1115.     /* developer number */
  1116.     setgadget(166, 70, 256, 12, "_Developer number:", NULL);
  1117.     ST12_Developer = PrevGadPtr = (struct Gadget *) CreateGadget
  1118.     (   STRING_KIND,
  1119.     PrevGadPtr,
  1120.     &Gadget,
  1121.         GTST_String, &(report.developer),
  1122.         GTST_MaxChars, LONGFIELD,
  1123.     GA_TabCycle, TRUE,
  1124.         GT_Underscore, '_',
  1125.     TAG_DONE
  1126.     );
  1127.  
  1128.     /* email */
  1129.     setgadget(166, 82, 256, 12, "_EMail:", NULL);
  1130.     ST12_EMail = PrevGadPtr = (struct Gadget *) CreateGadget
  1131.     (    STRING_KIND,
  1132.     PrevGadPtr,
  1133.     &Gadget,
  1134.     GTST_String, &(report.email),
  1135.     GTST_MaxChars, MEDFIELD,
  1136.     GA_TabCycle, TRUE,
  1137.         GT_Underscore, '_',
  1138.     TAG_DONE
  1139.     );
  1140.  
  1141.     /* There are 14 gadgets:
  1142.        BU99_Right
  1143.        BU99_TextEditor
  1144.        ST12_FirstName (2 subgadgets)
  1145.        ST12_LastName (2 subgadgets)
  1146.        ST12_Company (2 subgadgets)
  1147.        ST12_Phone (2 subgadgets)
  1148.        ST12_Developer (2 subgadgets)
  1149.        ST12_EMail (2 subgadgets) */
  1150.     drawgadgets(14);
  1151.  
  1152.     ActivateGadget(ST12_FirstName, MainWindowPtr, NULL);
  1153.     loop();
  1154.  
  1155.     if (!report.loaded)
  1156.     {   /* write out S:Report.sender
  1157.         # Refer: <last>,<first> (<company> ,phone <phone>)<LF>
  1158.         # Path: <email><LF>
  1159.         # ReferID: <developer><LF> */
  1160.  
  1161.         strcpy(report.refer, "# Refer: ");
  1162.         strcat
  1163.         (   report.refer,
  1164.             ((struct StringInfo *) ST12_LastName->SpecialInfo)->Buffer
  1165.         );
  1166.         strcat(report.refer, ",");
  1167.         strcat
  1168.         (   report.refer,
  1169.             ((struct StringInfo *) ST12_FirstName->SpecialInfo)->Buffer
  1170.         );
  1171.         strcat(report.refer, " (");
  1172.         strcat
  1173.         (   report.refer,
  1174.             ((struct StringInfo *) ST12_Company->SpecialInfo)->Buffer
  1175.         );
  1176.         strcat(report.refer, " ,phone ");
  1177.         strcat
  1178.         (   report.refer,
  1179.             ((struct StringInfo *) ST12_Phone->SpecialInfo)->Buffer
  1180.         );
  1181.         strcat(report.refer, ")\n");
  1182.  
  1183.         strcpy(report.path, "# Path: ");
  1184.         strcat
  1185.         (    report.path,
  1186.             ((struct StringInfo *) ST12_EMail->SpecialInfo)->Buffer
  1187.         );
  1188.         strcat(report.path, "\n");
  1189.  
  1190.         strcpy(report.referid, "# ReferID: ");
  1191.         strcat
  1192.         (   report.referid,
  1193.             ((struct StringInfo *) ST12_Developer->SpecialInfo)->Buffer
  1194.         );
  1195.         strcat(report.referid, "\n");
  1196.  
  1197.         strcpy(IOBuffer, report.refer);
  1198.         strcat(IOBuffer, report.path);
  1199.         strcat(IOBuffer, report.referid);
  1200.     
  1201.         writeout("S:Report.sender");
  1202.     }
  1203.     closewindow();
  1204. }
  1205.     
  1206. AGLOBAL void config(void)
  1207. {   /* PAGE 13 ************************************************************** */
  1208.     
  1209.     UBYTE i;
  1210.         
  1211.     verynewwindow
  1212.     (   CONFIGWIDTH, CONFIGHEIGHT,
  1213.         "Report+: Configuration Details",
  1214.         BUTTONIDCMP | STRINGIDCMP | MXIDCMP
  1215.     );
  1216.     
  1217.     /* This only cares about the configuration-information parts of the
  1218.        bug report. */
  1219.     if ((!report.loaded) && readin("S:Report.config"))
  1220.     {   /*  # Config: <model>,<cpu>,A=AA|ECS-pal|ECS|old-pal|old,
  1221.             D=AA|ECS|old,RAM=<chip>megC/<fast>megF,TD=<floppies>,
  1222.             HD=<controller>,<cards><LF> */
  1223.  
  1224.         offset = 0;
  1225.         parse("# Config: ");
  1226.     parse(",");
  1227.         report.model = 4;
  1228.     for (i = 0; i <= MODELS; i++)
  1229.     {   if (!stricmp(string, ModelOptions[i]))
  1230.         {   report.model = i;
  1231.                 break; // for speed
  1232.     }   }
  1233.         parse(",A=");
  1234.         report.cpu = 0;
  1235.     for (i = 0; i <= CPUS; i++)
  1236.     {   if (!stricmp(string, CPUOptions[i]))
  1237.         {   report.cpu = i;
  1238.                 break; // for speed
  1239.         }   }
  1240.  
  1241.     parse(",D=");
  1242.     if (!stricmp(string, "AA"))
  1243.         report.agnus = 0;
  1244.     elif (!stricmp(string, "ECS-pal"))
  1245.         report.agnus = 1;
  1246.     elif (!stricmp(string, "ECS"))
  1247.         report.agnus = 2;
  1248.     elif (!stricmp(string, "old-pal"))
  1249.         report.agnus = 3;
  1250.     else /* if (!stricmp(string, "old")) */
  1251.         report.agnus = 4;
  1252.  
  1253.     parse(",RAM=");
  1254.         // We will have here "AA", "ECS" or "old", but we don't use this.
  1255.  
  1256.     parse("megC/");
  1257.     strcpy(report.chipram, string);
  1258.  
  1259.     parse("megF,TD=");
  1260.     strcpy(report.fastram, string);
  1261.  
  1262.     parse(",HD=");
  1263.     report.floppies = atol(string);
  1264.  
  1265.     parse(",");
  1266.     strcpy(report.hard, string);
  1267.  
  1268.     parse("\n");
  1269.     strcpy(report.expansion, string);
  1270.     }
  1271.  
  1272.     /* These formal coordinates of these text gadgets must not overlap any
  1273.     other gadgets, otherwise any such overlapped gadgets will not be
  1274.     selectable, with the mouse at least. This definitely applies to radio
  1275.     and string gadgets, and most likely other types.
  1276.  
  1277.     model */
  1278.     setgadget(24, 40, 6 * FONTX, 0, "_Model:", PLACETEXT_ABOVE);
  1279.     TE13_ModelText = PrevGadPtr = (struct Gadget *) CreateGadget
  1280.     (   TEXT_KIND,
  1281.         PrevGadPtr,
  1282.         &Gadget,
  1283.         GT_Underscore, '_',
  1284.         TAG_DONE
  1285.     );
  1286.     setgadget(24, 40, 0, 0, NULL, PLACETEXT_RIGHT);
  1287.     MX13_Model = PrevGadPtr = (struct Gadget *) CreateGadget
  1288.     (   MX_KIND,
  1289.         PrevGadPtr,
  1290.         &Gadget,
  1291.         GTMX_Labels, &ModelOptions,
  1292.         GTMX_Active, report.model,
  1293.         TAG_DONE
  1294.     );
  1295.  
  1296.     /* Agnus */
  1297.     setgadget(160, 40, 13 * FONTX, 0, "Ch_ipset Type:", PLACETEXT_ABOVE);
  1298.     TE13_AgnusText = PrevGadPtr = (struct Gadget *) CreateGadget
  1299.     (   TEXT_KIND,
  1300.     PrevGadPtr,
  1301.     &Gadget,
  1302.         GT_Underscore, '_',
  1303.         TAG_DONE
  1304.     );
  1305.     setgadget(160, 40, 0, 0, NULL, PLACETEXT_RIGHT);
  1306.     MX13_Agnus = PrevGadPtr = (struct Gadget *) CreateGadget
  1307.     (   MX_KIND,
  1308.     PrevGadPtr,
  1309.     &Gadget,
  1310.     GTMX_Labels, &AgnusOptions,
  1311.     GTMX_Active, report.agnus,
  1312.     TAG_DONE
  1313.     );
  1314.  
  1315.     /* CPU */
  1316.     setgadget(160, 120, 10 * FONTX, 0, "_Processor:", PLACETEXT_ABOVE);
  1317.     // extra spaces ensure consistent centring
  1318.     TE13_CPUText = PrevGadPtr = (struct Gadget *) CreateGadget
  1319.     (   TEXT_KIND,
  1320.         PrevGadPtr,
  1321.         &Gadget,
  1322.         GT_Underscore, '_',
  1323.         TAG_DONE
  1324.     );
  1325.     setgadget(160, 120, 0, 0, NULL, PLACETEXT_RIGHT);
  1326.     MX13_CPU = PrevGadPtr = (struct Gadget *) CreateGadget
  1327.     (   MX_KIND,
  1328.         PrevGadPtr,
  1329.         &Gadget,
  1330.         GTMX_Labels, &CPUOptions,
  1331.         GTMX_Active, report.cpu,
  1332.         TAG_DONE
  1333.     );
  1334.  
  1335.     /* chip RAM */
  1336.     setgadget(246, 184, 1, 12, "Mb", PLACETEXT_RIGHT);
  1337.     TE13_ChipText = PrevGadPtr = (struct Gadget *) CreateGadget
  1338.     (   TEXT_KIND,
  1339.         PrevGadPtr,
  1340.         &Gadget,
  1341.         TAG_DONE
  1342.     );
  1343.     setgadget(188, 184, 64, 12, "_Chip RAM:", NULL);
  1344.     ST13_Chip = PrevGadPtr = (struct Gadget *) CreateGadget
  1345.     (   STRING_KIND,
  1346.         PrevGadPtr,
  1347.         &Gadget,
  1348.         GTST_String, &(report.chipram),
  1349.         GTST_MaxChars, 4,
  1350.         GA_TabCycle, TRUE,
  1351.         GT_Underscore, '_',
  1352.         TAG_DONE
  1353.     );
  1354.  
  1355.     // slow/fast RAM
  1356.     setgadget(246, 196, 1, 12, "Mb", PLACETEXT_RIGHT);
  1357.     TE13_FastText = PrevGadPtr = (struct Gadget *) CreateGadget
  1358.     (   TEXT_KIND,
  1359.         PrevGadPtr,
  1360.         &Gadget,
  1361.         TAG_DONE
  1362.     );
  1363.     setgadget(188, 196, 64, 12, "_Slow/fast RAM:", NULL);
  1364.     ST13_Fast = PrevGadPtr = (struct Gadget *) CreateGadget
  1365.     (   STRING_KIND,
  1366.         PrevGadPtr,
  1367.         &Gadget,
  1368.         GTST_String, &(report.fastram),
  1369.         GTST_MaxChars, 4,
  1370.         GA_TabCycle, TRUE,
  1371.         GT_Underscore, '_',
  1372.         TAG_DONE
  1373.     );
  1374.  
  1375.     /* floppies */
  1376.     setgadget(188, 208, 64, 12, "_Number of floppies:", NULL);
  1377.     IN13_Floppies = PrevGadPtr = (struct Gadget *) CreateGadget
  1378.     (   INTEGER_KIND,
  1379.     PrevGadPtr,
  1380.     &Gadget,
  1381.     GTIN_Number, report.floppies,
  1382.     GA_TabCycle, TRUE,
  1383.         GT_Underscore, '_',
  1384.     TAG_DONE
  1385.     );
  1386.  
  1387.     /* hard disk controller */
  1388.     setgadget(188, 220, 120, 12, "_Hard disk controller:", NULL);
  1389.     ST13_Hard = PrevGadPtr = (struct Gadget *) CreateGadget
  1390.     (    STRING_KIND,
  1391.     PrevGadPtr,
  1392.     &Gadget,
  1393.     GTST_String, &(report.hard),
  1394.     GTST_MaxChars, MEDFIELD,
  1395.     GA_TabCycle, TRUE,
  1396.         GT_Underscore, '_',
  1397.     TAG_DONE
  1398.     );
  1399.  
  1400.     /* expansion cards */
  1401.     setgadget(188, 232, 120, 12, "_Expansion cards:", NULL);
  1402.     ST13_Expansion = PrevGadPtr = (struct Gadget *) CreateGadget
  1403.     (   STRING_KIND,
  1404.         PrevGadPtr,
  1405.         &Gadget,
  1406.     GTST_String, &(report.expansion),
  1407.     GTST_MaxChars, LONGFIELD,
  1408.     GA_TabCycle, TRUE,
  1409.         GT_Underscore, '_',
  1410.     TAG_DONE
  1411.     );
  1412.  
  1413.     drawgadgets(42);
  1414.     ActivateGadget(ST13_Chip, MainWindowPtr, NULL);
  1415.     loop();
  1416.  
  1417.     strcpy(report.chipram,   ((struct StringInfo *) ST13_Chip->SpecialInfo)->Buffer);
  1418.     strcpy(report.fastram,   ((struct StringInfo *) ST13_Fast->SpecialInfo)->Buffer);
  1419.     strcpy(report.hard,      ((struct StringInfo *) ST13_Hard->SpecialInfo)->Buffer);
  1420.     report.floppies        = ((struct StringInfo *) IN13_Floppies->SpecialInfo)->LongInt;
  1421.     if (report.floppies < 0)
  1422.     {   report.floppies = 0;
  1423.     } elif (report.floppies > 3)
  1424.     {   report.floppies = 3;
  1425.     }
  1426.     strcpy(report.expansion, ((struct StringInfo *) ST13_Expansion->SpecialInfo)->Buffer);
  1427.  
  1428.     if (!report.loaded)
  1429.     {   strcpy(report.config, "# Config: ");
  1430.         strcpy(string, ModelOptions[report.model]);
  1431.         strlwr(string);
  1432.         strcat(report.config, string);
  1433.         strcat(report.config, ",");
  1434.         strcpy(string, CPUOptions[report.cpu]);
  1435.         strlwr(string);
  1436.         strcat(report.config, string);
  1437.         strcat(report.config, ",A=");
  1438.         switch(report.agnus)
  1439.         {
  1440.         case 0:
  1441.             strcat(report.config, "AA,D=AA");
  1442.         break;
  1443.         case 1:
  1444.             strcat(report.config, "ECS-pal,D=ECS");
  1445.         break;
  1446.         case 2:
  1447.             strcat(report.config, "ECS,D=ECS");
  1448.         break;
  1449.         case 3:
  1450.             strcat(report.config, "old-pal,D=old");
  1451.         break;
  1452.         default:
  1453.             strcat(report.config, "old,D=old");
  1454.         break;
  1455.         }
  1456.         strcat(report.config, ",RAM=");
  1457.         strcat(report.config, report.chipram);
  1458.         strcat(report.config, "megC/");
  1459.         strcat(report.config, report.fastram);
  1460.         strcat(report.config, "megF,TD=");
  1461.         stcl_d(string, report.floppies);
  1462.         strcat(report.config, string);
  1463.         strcat(report.config, ",HD=");
  1464.         strcat(report.config, report.hard);
  1465.         strcat(report.config, ",");
  1466.         strcat(report.config, report.expansion);
  1467.         strcat(report.config, "\n");
  1468.         strcpy(IOBuffer, report.config);
  1469.         writeout("S:Report.config");
  1470.     }
  1471.     closewindow();
  1472. }
  1473.  
  1474. MODULE void updatereportgadgets(void)
  1475. {   // the following command is only needed when New or Open... is the
  1476.     // cause of the update.
  1477.     GT_SetGadgetAttrs
  1478.     (   ST11_Summary,
  1479.         MainWindowPtr,
  1480.         NULL,
  1481.         GTST_String, &(report.summary),
  1482.         TAG_DONE
  1483.     );
  1484.  
  1485.     if (report.type == BUG && report.severity == 3)
  1486.     {   report.severity = 0;
  1487.     }
  1488.  
  1489.     GT_SetGadgetAttrs
  1490.     (   CY11_Type,
  1491.         MainWindowPtr,
  1492.         NULL,
  1493.         GTCY_Active, report.type,
  1494.         TAG_DONE
  1495.     );
  1496.     GT_SetGadgetAttrs
  1497.     (   LV11_Subsystem,
  1498.         MainWindowPtr,
  1499.         NULL,
  1500.         GTLV_Selected, report.subsystem,
  1501.         TAG_DONE
  1502.     );
  1503.  
  1504.     updateemail();
  1505.  
  1506.     if (report.type == BUG)
  1507.     {   GT_SetGadgetAttrs
  1508.         (   ST11_Pathname,
  1509.             MainWindowPtr,
  1510.             NULL,
  1511.             GTST_String, report.pp,
  1512.             GA_Disabled, FALSE,
  1513.             TAG_DONE
  1514.         );
  1515.         GT_SetGadgetAttrs
  1516.         (   BU11_PathnameASL,
  1517.             MainWindowPtr,
  1518.             NULL,
  1519.             GA_Disabled, FALSE,
  1520.             TAG_DONE
  1521.         );
  1522.         GT_SetGadgetAttrs
  1523.         (   ST11_Version,
  1524.             MainWindowPtr,
  1525.             NULL,
  1526.             GTST_String, report.pv,
  1527.             GA_Disabled, FALSE,
  1528.             TAG_DONE
  1529.         );
  1530.     } else
  1531.     {   GT_SetGadgetAttrs
  1532.         (   ST11_Pathname,
  1533.             MainWindowPtr,
  1534.             NULL,
  1535.             GTST_String, report.pp,
  1536.             GA_Disabled, TRUE,
  1537.             TAG_DONE
  1538.         );
  1539.         GT_SetGadgetAttrs
  1540.         (   BU11_PathnameASL,
  1541.             MainWindowPtr,
  1542.             NULL,
  1543.             GA_Disabled, TRUE,
  1544.             TAG_DONE
  1545.         );
  1546.         GT_SetGadgetAttrs
  1547.         (   ST11_Version,
  1548.             MainWindowPtr,
  1549.             NULL,
  1550.             GTST_String, report.pv,
  1551.             GA_Disabled, TRUE,
  1552.             TAG_DONE
  1553.         );
  1554.     }
  1555.     if (report.type == COM)
  1556.     {   GT_SetGadgetAttrs
  1557.         (   LV11_Subsystem,
  1558.             MainWindowPtr,
  1559.             NULL,
  1560.             GA_Disabled, TRUE,
  1561.             TAG_DONE
  1562.         );
  1563.         GT_SetGadgetAttrs
  1564.         (   ST11_3rdName,
  1565.             MainWindowPtr,
  1566.             NULL,
  1567.             GTST_String, report.thirdname,
  1568.             GA_Disabled, FALSE,
  1569.             TAG_DONE
  1570.         );
  1571.         GT_SetGadgetAttrs
  1572.         (   ST11_3rdVer,
  1573.             MainWindowPtr,
  1574.             NULL,
  1575.             GTST_String, report.thirdver,
  1576.             GA_Disabled, FALSE,
  1577.             TAG_DONE
  1578.         );
  1579.         GT_SetGadgetAttrs
  1580.         (   ST11_3rdManuf,
  1581.             MainWindowPtr,
  1582.             NULL,
  1583.             GTST_String, report.thirdmanuf,
  1584.             GA_Disabled, FALSE,
  1585.             TAG_DONE
  1586.         );
  1587.     } else
  1588.     {   GT_SetGadgetAttrs
  1589.         (   LV11_Subsystem,
  1590.             MainWindowPtr,
  1591.             NULL,
  1592.             GA_Disabled, FALSE,
  1593.             TAG_DONE
  1594.         );
  1595.         GT_SetGadgetAttrs
  1596.         (   ST11_3rdName,
  1597.             MainWindowPtr,
  1598.             NULL,
  1599.             GTST_String, report.thirdname,
  1600.             GA_Disabled, TRUE,
  1601.             TAG_DONE
  1602.         );
  1603.         GT_SetGadgetAttrs
  1604.         (   ST11_3rdVer,
  1605.             MainWindowPtr,
  1606.             NULL,
  1607.             GTST_String, report.thirdver,
  1608.             GA_Disabled, TRUE,
  1609.             TAG_DONE
  1610.         );
  1611.         GT_SetGadgetAttrs
  1612.         (   ST11_3rdManuf,
  1613.             MainWindowPtr,
  1614.             NULL,
  1615.             GTST_String, report.thirdmanuf,
  1616.             GA_Disabled, TRUE,
  1617.             TAG_DONE
  1618.         );
  1619.     }
  1620.     if (report.type == ENH)
  1621.     {   GT_SetGadgetAttrs
  1622.         (   ST11_Debug,
  1623.             MainWindowPtr,
  1624.             NULL,
  1625.             GTST_String, report.debug,
  1626.             GA_Disabled, TRUE,
  1627.             TAG_DONE
  1628.         );
  1629.         GT_SetGadgetAttrs
  1630.         (   CY11_Severity,
  1631.             MainWindowPtr,
  1632.             NULL,
  1633.             GA_Disabled, TRUE,
  1634.             GTCY_Active, report.severity,
  1635.             TAG_DONE
  1636.         );
  1637.         GT_SetGadgetAttrs
  1638.         (   ST11_KS,
  1639.             MainWindowPtr,
  1640.             NULL,
  1641.             GTST_String, report.ks,
  1642.             GA_Disabled, TRUE,
  1643.             TAG_DONE
  1644.         );
  1645.         GT_SetGadgetAttrs
  1646.         (   ST11_WB,
  1647.             MainWindowPtr,
  1648.             NULL,
  1649.             GTST_String, report.wb,
  1650.             GA_Disabled, TRUE,
  1651.             TAG_DONE
  1652.         );
  1653.     } else
  1654.     {   GT_SetGadgetAttrs
  1655.         (   ST11_Debug,
  1656.             MainWindowPtr,
  1657.             NULL,
  1658.             GTST_String, report.debug,
  1659.             GA_Disabled, FALSE,
  1660.             TAG_DONE
  1661.         );
  1662.         GT_SetGadgetAttrs
  1663.         (   CY11_Severity,
  1664.             MainWindowPtr,
  1665.             NULL,
  1666.             GA_Disabled, FALSE,
  1667.             GTCY_Active, report.severity,
  1668.             TAG_DONE
  1669.         );
  1670.         GT_SetGadgetAttrs
  1671.         (   ST11_KS,
  1672.             MainWindowPtr,
  1673.             NULL,
  1674.             GTST_String, report.ks,
  1675.             GA_Disabled, FALSE,
  1676.             TAG_DONE
  1677.         );
  1678.         GT_SetGadgetAttrs
  1679.         (   ST11_WB,
  1680.             MainWindowPtr,
  1681.             NULL,
  1682.             GTST_String, report.wb,
  1683.             GA_Disabled, FALSE,
  1684.             TAG_DONE
  1685.         );
  1686. }   }
  1687.  
  1688. AGLOBAL void newreport(ABOOL display)
  1689. {   ULONG i;
  1690.  
  1691.     report.floppies  = 1;
  1692.     report.agnus     = 0;
  1693.     report.cpu       = 2;
  1694.     report.model     = 4;
  1695.     report.type      = 0;
  1696.     report.severity  = 0;
  1697.     report.subsystem = 0;
  1698.     strcpy(report.chipram,    "2");
  1699.     strcpy(report.fastram,    "6");
  1700.     strcpy(report.hard,       "");
  1701.     strcpy(report.debug,      "");
  1702.     strcpy(report.developer,  "");
  1703.     strcpy(report.expansion,  "");
  1704.     strcpy(report.summary,    "");
  1705.     if (GetVar("Kickstart", report.ks, 6, NULL) == -1)
  1706.         report.ks[0] = 0;
  1707.     if (GetVar("Workbench", report.wb, 6, NULL) == -1)
  1708.         report.wb[0] = 0;
  1709.     strcpy(report.pv,         "");
  1710.     strcpy(report.pp,         "");
  1711.     strcpy(report.thirdname,  "");
  1712.     strcpy(report.thirdver,   "");
  1713.     strcpy(report.thirdmanuf, "");
  1714.     strcpy(report.lastname,   "");
  1715.     strcpy(report.firstname,  "");
  1716.     strcpy(report.company,    "");
  1717.     strcpy(report.phone,      "");
  1718.     strcpy(report.email,      "");
  1719.     strcpy(report.refer,      "");
  1720.     strcpy(report.referid,    "");
  1721.     strcpy(report.path,       "");
  1722.     strcpy(report.config,     "");
  1723.     strcpy(report.output,     "");
  1724.     for (i = 0; i <= 5; i++)
  1725.     {   report.textfield[i][0] = 0;
  1726.     }
  1727.     report.loaded = FALSE;
  1728.  
  1729.     /* Quicker than strcpy(report.foo, ""); is report.foo[0] = 0;
  1730.  
  1731.     Consider linking bug report generator with ID database to
  1732.     automatically generate the list of expansion cards. */
  1733.  
  1734.     if (display)
  1735.     {   updatereportgadgets();
  1736. }   }
  1737.  
  1738. AGLOBAL void openreport(void)
  1739. {   if (asl("~(#?.info)"))
  1740.     {   strcpy(report.output, aslresult);
  1741.         loadreport();
  1742.         if (page == 11)
  1743.         {   updatereportgadgets();
  1744. }   }   }
  1745.  
  1746. AGLOBAL void loadreport(void)
  1747. {   ULONG i;
  1748.  
  1749.     /* parse() returns when it has moved along and found the specified
  1750.        `ending string'. The contents, since last parse(), before the
  1751.        `ending string' are returned in string. */
  1752.  
  1753.     if (readin(report.output))
  1754.     {   report.loaded = TRUE;
  1755.  
  1756.         offset = 0;
  1757.         parse("# Subject: ");           // skip '# Subject: '
  1758.         parse("\n# Type: ");            // goto end of '\n# Type: '
  1759.         strcpy(report.summary, string);
  1760.         parse("\n# ");
  1761.         if (!strcmp(string, "bug"))
  1762.         {   report.type = BUG;
  1763.         } elif (!strcmp(string, "compat"))
  1764.         {   report.type = COM;
  1765.         } elif (!strcmp(string, "enhancement"))
  1766.         {   report.type = ENH;
  1767.         }
  1768.         if (report.type != COM)
  1769.         {   parse("Subsystem: ");
  1770.             parse("\n");
  1771.             for (i = 0; i <= SUBSYSTEMS; i++)
  1772.             {   if (!strcmp(string, subsystems[i].unfriendly))
  1773.                 {   report.subsystem = i;
  1774.                     break;
  1775.         }   }   }
  1776.         else
  1777.         {   parse("ProductName: ");
  1778.             parse(" (vers=");
  1779.             strcpy(report.thirdname,  string);
  1780.             parse(")\n# ProductInfo: :");
  1781.             strcpy(report.thirdver,   string);
  1782.             parse(":\n");
  1783.             strcpy(report.thirdmanuf, string);
  1784.         }
  1785.         parse("# Severity: ");
  1786.         parse("\n# ");
  1787.         if (!strcmp(string, "a"))
  1788.         {   report.severity = 0;
  1789.         } elif (!strcmp(string, "b"))
  1790.         {   report.severity = 1;
  1791.         } elif (!strcmp(string, "c"))
  1792.         {   report.severity = 2;
  1793.         } elif (!strcmp(string, "ok"))
  1794.         {   report.severity = 3;
  1795.         } elif (!strcmp(string, "e"))
  1796.         {   report.type     = ENH;
  1797.         }
  1798.  
  1799.         if (report.type != ENH)
  1800.         {   parse("Release: KS=");
  1801.             parse(",WB=");
  1802.             strcpy(report.ks, string);
  1803.             if (report.type == BUG)
  1804.             {   parse(",Program=");
  1805.                 strcpy(report.wb, string);
  1806.                 parse("\n");
  1807.                 strcpy(report.pv, string);
  1808.             } else
  1809.             {   // assert(report.type == COM);
  1810.                 parse("\n");
  1811.                 strcpy(report.wb, string);
  1812.                 report.pv[0] = 0;
  1813.             }
  1814.         } else report.pv[0] = 0;
  1815.         parse("# Date: ");
  1816.  
  1817.         // now sender fields
  1818.         parse("# Refer: ");
  1819.         parse(",");
  1820.         strcpy(report.lastname, string);
  1821.         parse(" (");
  1822.         strcpy(report.firstname, string);
  1823.         parse(" ,phone ");
  1824.         strcpy(report.company, string);
  1825.         parse(")\n# Path: ");
  1826.         strcpy(report.phone, string);
  1827.         parse("\n# ReferID: ");
  1828.         strcpy(report.email, string);
  1829.         parse("\n");
  1830.         strcpy(report.developer, string);
  1831.  
  1832.         // now config fields
  1833.         parse("# Config: ");
  1834.     parse(",");
  1835.     report.model = 4;
  1836.     for (i = 0; i <= MODELS; i++)
  1837.     {   if (!stricmp(string, ModelOptions[i]))
  1838.         {   report.model = i;
  1839.                 break; // for speed
  1840.     }   }
  1841.         parse(",A=");
  1842.         report.cpu = 0;
  1843.     for (i = 0; i <= CPUS; i++)
  1844.     {   if (!stricmp(string, CPUOptions[i]))
  1845.         {   report.cpu = i;
  1846.                 break; // for speed
  1847.         }   }
  1848.  
  1849.     parse(",D=");
  1850.     if (!stricmp(string, "AA"))
  1851.         report.agnus = 0;
  1852.     elif (!stricmp(string, "ECS-pal"))
  1853.         report.agnus = 1;
  1854.     elif (!stricmp(string, "ECS"))
  1855.         report.agnus = 2;
  1856.     elif (!stricmp(string, "old-pal"))
  1857.         report.agnus = 3;
  1858.     else /* if (!stricmp(string, "old")) */
  1859.         report.agnus = 4;
  1860.  
  1861.     parse(",RAM=");
  1862.         // We will have here "AA", "ECS" or "old", but we don't use this.
  1863.  
  1864.     parse("megC/");
  1865.     strcpy(report.chipram, string);
  1866.  
  1867.     parse("megF,TD=");
  1868.     strcpy(report.fastram, string);
  1869.  
  1870.     parse(",HD=");
  1871.     report.floppies = atol(string);
  1872.  
  1873.     parse(",");
  1874.     strcpy(report.hard, string);
  1875.  
  1876.     parse("\n");
  1877.         strcpy(report.expansion, string);
  1878.  
  1879.         report.pp[0] = 0;
  1880.  
  1881.         if (report.type == BUG)
  1882.         {   parse("### BRIEF BUG DESCRIPTION:\n");
  1883.             parse("\n### BUG GENERATION PROCEDURE OR EXAMPLE:\n");
  1884.             strcpy(report.textfield[0], string);     // bug description
  1885.             parse("\n### ALSO RUNNING:\n");
  1886.             strcpy(report.textfield[1], string);     // bug procedure
  1887.             parse("\n### IF THIS WORKS DIFFERENTLY ON OTHER VERSIONS "
  1888.                   "OR HARDWARE, EXPLAIN:\n");
  1889.             strcpy(report.debug, string);            // also running
  1890.             parse("\n### RELATED PROBLEMS:\n");
  1891.             strcpy(report.textfield[2], string);     // explain differently
  1892.             parsetoend();
  1893.             strcpy(report.textfield[3], string);     // related problems
  1894.         } elif (report.type == COM)
  1895.         {   if (report.severity != 3)
  1896.             {   parse("### BRIEF BUG DESCRIPTION:\n");
  1897.                 parse("\n### BUG GENERATION PROCEDURE OR EXAMPLE:\n");
  1898.                 strcpy(report.textfield[0], string); // bug description
  1899.                 parse("\n### ALSO RUNNING:\n");
  1900.                 strcpy(report.textfield[1], string); // bug procedure
  1901.                 parse("\n### IF THIS WORKS DIFFERENTLY ON OTHER VERSIONS "
  1902.                       "OR HARDWARE, EXPLAIN:\n");
  1903.                 strcpy(report.debug, string);        // also running
  1904.                 parse("\n### WHAT DEVELOPER IS DOING IN THAT AREA OF SW "
  1905.                       "OR HW:\n");
  1906.                 strcpy(report.textfield[2], string); // explain differently
  1907.                 parse("\n### RELATED PROBLEMS:\n");
  1908.                 strcpy(report.textfield[3], string); // what doing?
  1909.                 parsetoend();
  1910.                 strcpy(report.textfield[4], string); // related problems
  1911.             } else
  1912.             {   parse("### BRIEF BUG DESCRIPTION:\n");
  1913.                 parse("\n### BUG GENERATION PROCEDURE OR EXAMPLE:\n");
  1914.                 strcpy(report.textfield[0], string); // bug description
  1915.                 parse("\n### WHAT DEVELOPER IS DOING IN THAT AREA OF SW "
  1916.                       "OR HW:\n");
  1917.                 strcpy(report.textfield[1], string); // explain differently
  1918.                 parse("\n### RELATED PROBLEMS:\n");
  1919.                 strcpy(report.textfield[2], string); // what doing?
  1920.                 parsetoend();
  1921.                 strcpy(report.textfield[3], string); // related problems
  1922.         }   }
  1923.         else
  1924.         {   // assert(report.type == ENH);
  1925.             parse("### ENHANCEMENT REQUEST:\n");
  1926.             parsetoend();
  1927.             strcpy(report.textfield[0], string);
  1928.         }
  1929.         updatereportgadgets();
  1930. }   }
  1931.  
  1932. /*          # Subject: <subject><LF>
  1933.             # Type: bug|compat|enhancement<LF>
  1934. BUG,ENH     # Subsystem: <subsystem><LF>
  1935. COM         # ProductName: <name> (vers=<version>)
  1936. COM         # ProductInfo: :<manufacturer>:
  1937.             # Severity: a|b|c|ok|e
  1938. BUG         # Release: KS=<version>,WB=<version>,Program=<version>
  1939. COM         # Release: KS=<version>,WB=<version>
  1940.             # Date: <weekday> dd-Mon-yy hh:mm:ss
  1941.             # Refer: <refer>
  1942.             # Path: <path>
  1943.             # ReferID: <referid>
  1944.             # Config: <config>
  1945. BUG,COMa-c  ### BRIEF BUG DESCRIPTION:
  1946. BUG,COMa-c  ### BUG GENERATION PROCEDURE OR EXAMPLE:
  1947. BUG,COM     ### ALSO RUNNING:
  1948.             <debug>
  1949. BUG,COM     ### IF THIS WORKS DIFFERENTLY ON OTHER VERSIONS OR HARDWARE,
  1950.             EXPLAIN:
  1951. COMa-c        ### WHAT DEVELOPER IS DOING IN THAT AREA OF SW OR HW:    
  1952. BUG,COMa-c  ### RELATED PROBLEMS:
  1953. ENH         ### ENHANCEMENT REQUEST: */
  1954.  
  1955. AGLOBAL void report2(void)
  1956. {   struct Hook    Hook1Struct;
  1957.     STRPTR         textBuffer[MAXELEMENTS_1 + 1];
  1958.     TEXT           GadTitle[MAXELEMENTS_1 + 1][VLONGFIELD + 1];
  1959.     ULONG          i, counter, elements;
  1960.     struct TagItem tag_texteditor[4] =
  1961.     { { GA_ID,                    NULL                  }, // ti_Data filled later
  1962.       { GA_RelVerify,             TRUE                  },
  1963.       { GA_TEXTEDITOR_ExportWrap, 75                    },
  1964.       { TAG_END,                  NULL                  }
  1965.     }, tag_subcaption[3] =
  1966.     { { LABEL_Text,               NULL                  }, // ti_Data filled later
  1967.       { LABEL_Justification,      LJ_CENTRE             },
  1968.       { TAG_END,                  NULL                  }
  1969.     }, tag_button[4] =
  1970.     { { GA_ID,                    GID_1_BU1             },
  1971.       { GA_RelVerify,             TRUE                  },
  1972.       { GA_Text,                  (ULONG) "_Other page" },
  1973.       { TAG_END,                  NULL                  }
  1974.     }, tag_supercaption[7] =
  1975.     { { LAYOUT_Orientation,       LAYOUT_ORIENT_VERT    },
  1976.       { LAYOUT_SpaceOuter,        TRUE                  },
  1977.       { LAYOUT_VertAlignment,     LALIGN_CENTER         },
  1978.       { LAYOUT_HorizAlignment,    LALIGN_CENTER         },
  1979.       { LAYOUT_BevelStyle,        BVS_NONE              },
  1980.       { LAYOUT_AddImage,          NULL                  }, // ti_Data filled later
  1981.       { TAG_END,                  NULL                  }
  1982.     }, tag_onlylayout[19] =
  1983.     { { LAYOUT_Orientation,       LAYOUT_ORIENT_VERT    },
  1984.       { LAYOUT_SpaceOuter,        TRUE                  },
  1985.       { LAYOUT_DeferLayout,       TRUE                  },
  1986.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1987.       { CHILD_WeightedHeight,     0                     },
  1988.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1989.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1990.       { CHILD_WeightedHeight,     0                     },
  1991.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1992.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1993.       { CHILD_WeightedHeight,     0                     },
  1994.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1995.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1996.       { CHILD_WeightedHeight,     0                     },
  1997.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1998.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  1999.       { CHILD_WeightedHeight,     0                     },
  2000.       { LAYOUT_AddChild,          NULL                  }, // ti_Data filled later
  2001.       { TAG_END,                  NULL                  }
  2002.     }, tag_rootlayout[10] =
  2003.     { { LAYOUT_Orientation,    LAYOUT_ORIENT_VERT    },
  2004.       { LAYOUT_SpaceOuter,     TRUE                  },
  2005.       { LAYOUT_DeferLayout,    TRUE                  },
  2006.       { LAYOUT_AddChild,       NULL                  }, // ti_Data filled later
  2007.       { CHILD_WeightedHeight,  100,                  },
  2008.       { LAYOUT_AddChild,       NULL                  }, // ti_Data filled later
  2009.       { CHILD_WeightedHeight,  0                     },
  2010.       { LAYOUT_AddChild,       NULL                  }, // ti_Data filled later
  2011.       { CHILD_WeightedHeight,  0                     },
  2012.       { TAG_END,               NULL                  }
  2013.     }, tag_window[15] =
  2014.     { { WA_PubScreen,          NULL                                            }, // ti_Data filled later
  2015.       { WA_ScreenTitle,        (ULONG) "Report+"                               },
  2016.       { WA_Title,              (ULONG) "Report+: Report Details (Page 2 of 2)" },
  2017.       { WA_Activate,           TRUE                  },
  2018.       { WA_DepthGadget,        TRUE                  },
  2019.       { WA_DragBar,            TRUE                  },
  2020.       { WA_CloseGadget,        TRUE                  },
  2021.       { WA_SizeGadget,         TRUE                  },
  2022.       { WA_IDCMP,              IDCMP_RAWKEY          },
  2023.       { WINDOW_IDCMPHook,      NULL                  }, // ti_Data filled later
  2024.       { WINDOW_IDCMPHookBits,  IDCMP_RAWKEY          },
  2025.       { WINDOW_MenuStrip,      NULL                  }, // ti_Data filled later
  2026.       { WINDOW_Position,       WPOS_FULLSCREEN       },
  2027.       { WINDOW_ParentGroup,    NULL                  }, // ti_Data filled later
  2028.       { TAG_END,               NULL                  }
  2029.     };
  2030.  
  2031.     switch(report.type)
  2032.     {
  2033.     case BUG:
  2034.         strcpy(GadTitle[0], "Brief bug _description:");
  2035.         strcpy(GadTitle[1], "_Bug generation procedure or example:");
  2036.         strcpy(GadTitle[2], "_If this works differently on other versions or hardware, explain:");
  2037.         strcpy(GadTitle[3], "_Related problems:");
  2038.         elements = 3;
  2039.     break;
  2040.     case COM:
  2041.         if (report.severity == 3)
  2042.         {   strcpy(GadTitle[0], "_If this works differently on other versions or hardware, explain:");
  2043.             elements = 0;
  2044.         } else
  2045.         {   strcpy(GadTitle[0], "Brief bug _description:");
  2046.             strcpy(GadTitle[1], "_Bug generation procedure or example:");
  2047.             strcpy(GadTitle[2], "_If this works differently on other versions or hardware, explain:");
  2048.             strcpy(GadTitle[3], "_What developer is doing in that area of software or hardware:");
  2049.             strcpy(GadTitle[4], "_Related problems:");
  2050.             elements = 4;
  2051.         }
  2052.         break;
  2053.     case ENH:
  2054.         strcpy(GadTitle[0], "_Enhancement request:");
  2055.         elements = 0;
  2056.     break;
  2057.     default:
  2058.     break;
  2059.     }
  2060.  
  2061.     /* window
  2062.         root-layout
  2063.          only-layout
  2064.           super-caption
  2065.            sub-caption
  2066.           texteditor
  2067.          button
  2068.          button */
  2069.  
  2070.     counter = 3;
  2071.     for (i = 0; i <= elements; i++)
  2072.     {   tag_subcaption[0].ti_Data          = (ULONG) GadTitle[i];
  2073.         tag_texteditor[0].ti_Data          = GID_1_TE1 + i;
  2074.         tag_supercaption[5].ti_Data        = (ULONG) NewObjectA(LABEL_GetClass(),      NULL, tag_subcaption);
  2075.         tag_onlylayout[counter].ti_Data    = (ULONG) NewObjectA(LAYOUT_GetClass(),     NULL, tag_supercaption);
  2076.         counter += 2;
  2077.         tag_onlylayout[counter].ti_Data    =
  2078.         report_gadgets[GID_1_TE1 + i]      = (ULONG) NewObjectA(TEXTEDITOR_GetClass(), NULL, tag_texteditor);
  2079.         counter++;
  2080.     }
  2081.     tag_onlylayout[counter].ti_Tag         = TAG_END;
  2082.  
  2083.     tag_rootlayout[3].ti_Data   = (ULONG) NewObjectA(LAYOUT_GetClass(), NULL,            tag_onlylayout);
  2084.     tag_rootlayout[5].ti_Data   =
  2085.     report_gadgets[GID_1_BU1]   = (ULONG) NewObjectA(NULL,              "button.gadget", tag_button);
  2086.     tag_button[0].ti_Data       = GID_1_BU2;
  2087.     tag_button[2].ti_Data       = (ULONG) "Menu";
  2088.     tag_rootlayout[7].ti_Data   =
  2089.     report_gadgets[GID_1_BU2]   = (ULONG) NewObjectA(NULL,              "button.gadget", tag_button);
  2090.     tag_window[13].ti_Data      =
  2091.     report_gadgets[GID_1_LY1]   = (ULONG) NewObjectA(LAYOUT_GetClass(), NULL,            tag_rootlayout);
  2092.  
  2093.     InitHook(&Hook1Struct, Hook1Func, NULL);
  2094.     tag_window[9].ti_Data       = &Hook1Struct;
  2095.     lockscreen();
  2096.     tag_window[0].ti_Data       = (ULONG) ScreenPtr;
  2097.     gadtools();
  2098.     tag_window[11].ti_Data      = MenuPtr;
  2099.     WinObject[1]                = (ULONG) NewObjectA(WINDOW_GetClass(), NULL,             tag_window);
  2100.     unlockscreen();
  2101.     if (!WinObject[1]) // Object creation successful?
  2102.     {   rq("Can't create ReAction objects!");
  2103.     }
  2104.     openwindow();
  2105.     OnMenu(MainWindowPtr, FULLMENUNUM(MN_PROJECT, IN_SAVE,   NOSUB));
  2106.     OnMenu(MainWindowPtr, FULLMENUNUM(MN_PROJECT, IN_SAVEAS, NOSUB));
  2107.  
  2108.     // Do any necessary imports.
  2109.     switch(report.type)
  2110.     {
  2111.     case BUG:
  2112.         SetGadgetAttrs
  2113.         (   report_gadgets[GID_1_TE1], MainWindowPtr, NULL,
  2114.             GA_TEXTEDITOR_Contents,    report.textfield[0]
  2115.         );
  2116.         SetGadgetAttrs
  2117.         (   report_gadgets[GID_1_TE2], MainWindowPtr, NULL,
  2118.             GA_TEXTEDITOR_Contents,    report.textfield[1]
  2119.         );
  2120.         SetGadgetAttrs
  2121.         (   report_gadgets[GID_1_TE3], MainWindowPtr, NULL,
  2122.             GA_TEXTEDITOR_Contents,    report.textfield[2]
  2123.         );
  2124.         SetGadgetAttrs
  2125.         (   report_gadgets[GID_1_TE4], MainWindowPtr, NULL,
  2126.             GA_TEXTEDITOR_Contents,    report.textfield[4]
  2127.         );
  2128.     break;
  2129.     case COM:
  2130.         if (report.severity == 3)
  2131.         {   SetGadgetAttrs
  2132.             (   report_gadgets[GID_1_TE1],         MainWindowPtr, NULL,
  2133.                 GA_TEXTEDITOR_Contents,            report.textfield[2]
  2134.             ); // if this works differently...
  2135.         } else
  2136.         {   for (i = 0; i <= 4; i++)
  2137.             {   SetGadgetAttrs
  2138.                 (   report_gadgets[GID_1_TE1 + i], MainWindowPtr, NULL,
  2139.                     GA_TEXTEDITOR_Contents,        report.textfield[i]
  2140.                 );
  2141.         }   }
  2142.     break;
  2143.     case ENH:
  2144.         SetGadgetAttrs
  2145.         (   report_gadgets[GID_1_TE1], MainWindowPtr, NULL,
  2146.             GA_TEXTEDITOR_Contents,    report.textfield[5]
  2147.         ); // enhancement request
  2148.     break;
  2149.     default:
  2150.         ; // assert(0);
  2151.     break;
  2152.     }
  2153.  
  2154.     /* 0: brief bug description
  2155.        1: bug generation procedure or example
  2156.        2: if this works differently...
  2157.        3: what developer is doing...
  2158.        4: related problems
  2159.        5: enhancement request */
  2160.  
  2161.     ActivateLayoutGadget(report_gadgets[GID_1_LY1], MainWindowPtr, NULL, (Object) report_gadgets[GID_1_TE1]);
  2162.     loop();
  2163.  
  2164.     for (i = 0; i <= elements; i++)
  2165.     {   textBuffer[i] = (STRPTR) DoGadgetMethod(report_gadgets[GID_1_TE1 + i], MainWindowPtr, NULL, GM_TEXTEDITOR_ExportText, NULL);
  2166.     }
  2167.     switch(report.type)
  2168.     {
  2169.     case BUG:
  2170.         strcpy(report.textfield[0], textBuffer[0]); // brief bug description
  2171.         strcpy(report.textfield[1], textBuffer[1]); // bug generation procedure or example
  2172.         strcpy(report.textfield[2], textBuffer[2]); // if this works differently...
  2173.         strcpy(report.textfield[4], textBuffer[3]); // related problems
  2174.     break;
  2175.     case COM:
  2176.         if (report.severity == 3)
  2177.         {   strcpy(report.textfield[2], textBuffer[0]); // if this works differently...
  2178.         } else
  2179.         {   strcpy(report.textfield[0], textBuffer[0]); // brief bug description
  2180.             strcpy(report.textfield[1], textBuffer[1]); // bug generation procedure or example
  2181.             strcpy(report.textfield[2], textBuffer[2]); // if this works differently...
  2182.             strcpy(report.textfield[3], textBuffer[3]); // what developer is doing...
  2183.             strcpy(report.textfield[4], textBuffer[4]); // related problems
  2184.         }
  2185.     break;
  2186.     case ENH:
  2187.         strcpy(report.textfield[5], textBuffer[0]); // enhancement request
  2188.     break;
  2189.     default:
  2190.         ; // assert(0);
  2191.     break;
  2192.     }
  2193.  
  2194.     for (i = 0; i <= elements; i++)
  2195.     {   FreeVec((APTR) textBuffer[i]);
  2196.         textBuffer[i] = NULL;
  2197.     }
  2198.     closewindow();
  2199. }
  2200.  
  2201. MODULE ULONG Hook1Func(struct Hook *h, VOID *o, VOID *msg)
  2202. {   /* "When the hook is called, the data argument points to the
  2203.     window object and message argument to the IntuiMessage." */
  2204.  
  2205.     UWORD code, qual;
  2206.  
  2207.     geta4(); // wait till here before doing anything
  2208.     code = ((struct IntuiMessage *) msg)->Code;
  2209.     qual = ((struct IntuiMessage *) msg)->Qualifier;
  2210.     switch(code)
  2211.     {
  2212.     case SCAN_HELP:
  2213.         helpabout();
  2214.     break;
  2215.     case SCAN_ESCAPE:
  2216.         if ((qual & IEQUALIFIER_LSHIFT) || (qual & IEQUALIFIER_RSHIFT))
  2217.         {   cleanexit(EXIT_SUCCESS);
  2218.         } else
  2219.         {   page = 0;
  2220.         }
  2221.     break;
  2222.     case SCAN_B:
  2223.         if (report.type == BUG || (report.type == COM && report.severity != 3))
  2224.         {   ActivateLayoutGadget(report_gadgets[GID_1_LY1], MainWindowPtr, NULL, (Object) report_gadgets[GID_1_TE2]);
  2225.         } // "_bug generation procedure or example", when present, is always GID_1_TE2.
  2226.     break;
  2227.     case SCAN_D:
  2228.         if (report.type == BUG || (report.type == COM && report.severity != 3))
  2229.         {   ActivateLayoutGadget(report_gadgets[GID_1_LY1], MainWindowPtr, NULL, (Object) report_gadgets[GID_1_TE1]);
  2230.         } // "brief bug _description", when present, is always GID_1_TE1.
  2231.     break;
  2232.     case SCAN_E:
  2233.         if (report.type == ENH)
  2234.         {   ActivateLayoutGadget(report_gadgets[GID_1_LY1], MainWindowPtr, NULL, (Object) report_gadgets[GID_1_TE1]);
  2235.         } // "_enhancement request", when present, is always GID_1_TE1.
  2236.     break;
  2237.     case SCAN_I:
  2238.         if (report.type == BUG || (report.type == COM && report.severity != 3))
  2239.         {   ActivateLayoutGadget(report_gadgets[GID_1_LY1], MainWindowPtr, NULL, (Object) report_gadgets[GID_1_TE3]);
  2240.         } elif (report.type == COM && report.severity == 3)
  2241.         {   ActivateLayoutGadget(report_gadgets[GID_1_LY1], MainWindowPtr, NULL, (Object) report_gadgets[GID_1_TE1]);
  2242.         }
  2243.     break;
  2244.     case SCAN_R:
  2245.         if (report.type == BUG)
  2246.         {   ActivateLayoutGadget(report_gadgets[GID_1_LY1], MainWindowPtr, NULL, (Object) report_gadgets[GID_1_TE4]);
  2247.         } elif (report.type == COM && report.severity != 3)
  2248.         {   ActivateLayoutGadget(report_gadgets[GID_1_LY1], MainWindowPtr, NULL, (Object) report_gadgets[GID_1_TE5]);
  2249.         }
  2250.     break;
  2251.     case SCAN_W:
  2252.         if (report.type == COM && report.severity != 3)
  2253.         {   ActivateLayoutGadget(report_gadgets[GID_1_LY1], MainWindowPtr, NULL, (Object) report_gadgets[GID_1_TE3]);
  2254.         } // "_what developer is doing...", when present, is always GID_1_TE4.
  2255.     break;
  2256.     default:
  2257.     break;
  2258.     }
  2259.  
  2260.     return(1);
  2261. }
  2262.  
  2263. MODULE void updateemail(void)
  2264. {   if
  2265.     (   (!stricmp(subsystems[report.subsystem].unfriendly, "wormwars"))
  2266.      || (!stricmp(subsystems[report.subsystem].unfriendly, "report+"))
  2267.     )
  2268.     {   GT_SetGadgetAttrs
  2269.         (   TE11_EMailTo,
  2270.             MainWindowPtr,
  2271.             NULL,
  2272.             GTTX_Text, "amigansoftware@altavista.com",
  2273.             TAG_DONE
  2274.         );
  2275.     } else
  2276.     {   GT_SetGadgetAttrs
  2277.         (   TE11_EMailTo,
  2278.             MainWindowPtr,
  2279.             NULL,
  2280.             GTTX_Text, "support@haage-partner.com",
  2281.             TAG_DONE
  2282.         );
  2283. }   }
  2284.  
  2285.